2011-08-23 153 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