2010-11-02 65 views
3

我有以下流利的映射:NHibernate的級聯集合中刪除時,插入新項目不爲空集

public ScanDeliverySessionMap() 
    { 
     Id(x => x.Id); 
     ... 
     ... 
     HasManyToMany(x => x.ToScanForms) <--- IList<Form> ToScanForms ---> 
      .Table("ToScanForm") 
      .ParentKeyColumn("SessionId") 
      .ChildKeyColumn("FormId").Cascade.SaveUpdate(); 
    } 

    public FormMap() 
    { 

     Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log"); 

     .... 
     .... 

     HasManyToMany(x => x.ScanDeliverySessions) 
      .Table("ToScanForm") 
      .ParentKeyColumn("FormId") 
      .ChildKeyColumn("SessionId").Inverse(); 
    } 

當我嘗試插入新的表格到ToScanForms收集 一切看似正常工作,但看着NHProf 我看到NH casacde在所有ToScanForms項目上刪除 ,然後NH INSERT包括新項目的ToScanForms項目。

一些截圖:發生 alt text alt text

回答

4

這種行爲,因爲NHibernate的不知道哪個集合中的實體是新的,哪些是舊的,所以他必須刪除一切,然後重新插入。

爲了防止出現這種情況,行爲很簡單:將您的屬性更改爲ICollection並將您的HasManyToMany映射爲集合。您的映射將被更改爲以下:

public ScanDeliverySessionMap() 
{ 
    Id(x => x.Id); 
    ... 
    ... 
    HasManyToMany(x => x.ToScanForms) //<--- ICollection<Form> ToScanForms ---> 
     .AsSet() 
     .Table("ToScanForm") 
     .ParentKeyColumn("SessionId") 
     .ChildKeyColumn("FormId").Cascade.SaveUpdate(); 
} 

public FormMap() 
{ 

    Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log"); 

    .... 
    .... 

    HasManyToMany(x => x.ScanDeliverySessions) 
     .AsSet() 
     .Table("ToScanForm") 
     .ParentKeyColumn("FormId") 
     .ChildKeyColumn("SessionId").Inverse(); 
} 

引擎蓋下的NHibernate將使用Iesi填入收藏HashSet的,所以現在他知道哪些實體是新的,哪些是舊的。

+0

謝謝!也許你有一個想法如何解決與關係有關的另一個問題。 當我嘗試創建一個ScanDeliverySessions的新實例時,它會創建主記錄,但不會在查找標籤中創建子項記錄 – ari 2010-11-02 12:23:28