2011-08-23 52 views
1

我有一個叫Package的類與Package有着多對多的關係。這種雙向關係的含義是,如果某個產品具有某種形狀,則可以通過與該形狀關聯的包進行包裝。這也適用於相反的情況,如果產品是通過包裝進行包裝的,這意味着產品應該是與此包裝相關的形狀。NHIbernate雙向多對多映射插入更新問題

因此,我有一個包含Shape和Package的Shape模型的域模型。 NH映射相應地產生一個Shape,Package和PackageToShape表。

但是,當我應用版本控制時,會導致多個更新並在PackageToShape表中插入。實際上,發生的是一個關係,例如: ShapeId = 1,PackageId = 1首先被刪除,然後再次插入!實際上我使用Guids。但重點是,通過這個設置,NH在多對多表上創建多個刪除和插入語句,首先刪除一行,然後再次添加完全相同的行!

有沒有辦法來防止這種情況發生?

映射(使用流利NH)

public sealed class ShapeMap: EntityMap<Shape, Guid, ShapeDto> 
{ 
    public ShapeMap() 
    { 
     HasManyToMany(s => s.Packages) 
      // Fetch.Join will raise laizy collection load error 
      .Fetch.Select() 
      .AsSet() 
      .Cascade.All(); 
     HasManyToMany(s => s.UnitGroups) 
      // Fetch.Join will raise laizy collection load error 
      .Fetch.Select() 
      .AsSet() 
      .Cascade.All(); 
     HasManyToMany(s => s.Routes) 
      // Fetch.Join will raise laizy collection load error 
      .Fetch.Select() 
      .AsSet() 
      .Cascade.All(); 
    } 

的映射封裝:

public class PackageMap : EntityMap<Package, Guid, PackageDto> 
{ 
    public PackageMap() 
    { 
     Map(p => p.Abbreviation).Not.Nullable().Length(30).Unique(); 
     HasManyToMany(p => p.Shapes) 
      // Fetch.Join will raise laizy collection load error 
      .Fetch.Select() 
      .AsSet() 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

實體映射實現了ID,名稱(唯一的)和版本映射。

回答

0

我發現了這個問題。在收藏品的創作者中,我創建了新的列表,顯然這是你不能用NH做的。我想將我的內部HashSet作爲IEnumerable公開給外部世界,我認爲這是首選的方式。在我的保護這些藏品的制定者我有類似的代碼:

protected set { _mySet = new HashSet(value); } 

我跑進是NH不支持原生點網4 ISet的第二個問題。你必須實現NH提供的集合(Iesi.Collections.Generic.ISet)。

發生了什麼事是因爲我從NH提供的集合中創建了一個新的內部集合,NH認爲,好吧,這不是同一個集合,所以這個對象是髒的,因此更新版本並開始級聯這些更改。

我問的這個問題總結了我摔跤的困境,但現在看起來已經解決了:Approach to handle business collections