Мне называли объект объекта Patient
и этому объекту называли свойство Visits
который имеет тип VisitsCollection
.
VisitsCollections
дочерний класс IList<Visit>
но это также добавляет некоторую пользовательскую логику к набору (как автоматическое упорядочивание, некоторая проверка, уведомления, и т.д.).
Я должен использовать пользовательский тип набора, поскольку он добавляет некоторые данные к объектам, которые добавляются к набору, и выполняет некоторые другие документы прозрачно.
Теперь я хочу отобразить это в NHibernate, таким образом, я создал:
<list name="Visits" lazy="true" fetch="select">
<key foreign-key="PatientId" />
<index column="Timestamp" />
<one-to-many class="Visit" not-found="ignore"/>
</list>
Я получаю исключение:
Не мог бросить объект типа 'NHibernate. Набор. PersistentList' для ввода '... VisitsCollection'
Каждый раз, когда я получаю доступ к свойству посещений.
Я также попытался отобразить его этот путь:
<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection">
<key foreign-key="PatientId" />
<index column="Timestamp" />
<one-to-many class="Visit" not-found="ignore"/>
</list>
но тем не менее, я получаю это исключение:
Пользовательский тип не реализует UserCollectionType:..... VisitsCollection
Я не хочу наследовать мой VisitsCollection
от любого типа NHibernate, поскольку класс набора является частью платформы, что я хочу, чтобы это было агностиком DAL (поскольку это будет использоваться во многих сценариях - не только с базой данных).
Какие-либо идеи о том, как отобразить это, сохранив структуру моего кода?
Заранее спасибо.
Я никогда не использую пользовательские типы коллекций, в основном потому, что мне лень. NHibernate хочет, чтобы вы использовали IUserCollectionType, как я полагаю, а это требует некоторой сантехники.
Вместо этого я бы остановился на использовании методов расширения, как обсуждал Billly McCafferty. Но у вас код написан так...
В качестве альтернативы, вы можете отобразить вашу коллекцию как компонент, как обсуждалось здесь Колином Джеком. Это может быть проще для вашего сценария?
Также проверьте этот поток SO.
Я также голосую за то, чтобы не использовать пользовательские коллекции. В любом случае, вы можете сделать это через компонент.
<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core">
<set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" >
<key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" />
<!--This is used to set the type of the collection items-->
<one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/>
</set>
How to map NHibernate custom collection with fluentNHibernate?