7

我有一個名爲Patient的實體對象,此實體具有Visits類型的屬性,其類型爲VisitsCollectionNHibernate自定義集合類型

VisitsCollectionsIList<Visit>的子類,但它也爲集合添加了一些自定義邏輯(如自動排序,一些驗證,通知等)。

I 需要使用自定義集合類型,因爲它向添加到集合中的實體添加了一些數據並透明地執行了其他一些文書工作。

現在我要地圖,在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.Collection的」對象。 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

我不想從任何NHibernate類型繼承我的VisitsCollection,因爲集合類是我希望它成爲框架的一部分DAL-agnos tic(因爲它將在許多場景中使用 - 不僅與數據庫一起使用)。

關於如何映射這個,保存我的代碼結構的任何想法?

在此先感謝。

回答

6

我從來不使用自定義集合類型,主要是因爲我很懶。 NHibernate希望你使用IUserCollectionType我相信,這需要一些管道。

與此不同,我的第一站就是使用擴展方法discussed by Billly McCafferty。但你有寫的代碼...

或者,你可以映射您的收藏作爲一個組件作爲discussed here by Colin Jack。這對你的情況可能更容易?

另請檢查此SO thread

1

我也投票不使用自定義集合。無論如何,你可以通過組件來完成。

<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?

0

僅供參考,這裏是你如何能使用FluentNHibernate

我們是否應該或不應該創建自定義集合類型恕我直言,一個單獨的話題

public class PatientOverride : IAutoMappingOverride<Patient> 
{ 
     public void Override(AutoMapping<Patient> mapping) 
     { 
      mapping.Component(
       x => x.Visits, 
       part => 
       { 
        part.HasMany(Reveal.Member<VisitsCollection, IEnumerable<Visit>>("backingFieldName")) // this is the backing field name for collection inside the VisitsCollection class 
        .KeyColumn("PatientId") 
        .Inverse(); // depends on your use case whether you need it or not 
       }); 
     } 
}