NHIbernate双向多对多映射插入更新问题

时间:2011-08-23 10:13:58

标签: nhibernate-mapping many-to-many auto-versioning

我有一个名为Shape的类,它与Package有很多关系。这种双向关系的含义是,如果产品具有某种形状,则可以通过与形状相关联的包进行打包。这也适用于逆,如果产品由Package打包,这意味着Product应该是与此Package关联的Shape。

因此,我有一个包含Shape的域模型,其中包含包含Shapes的包和包。因此,NH映射会生成Shape,Package和PackageToShape表。

但是,当我应用版本控制时,这会导致PackageToShape表中的多个更新和插入。实际上,发生的事情就是关系,例如: ShapeId = 1,首先删除PackageId = 1,然后再次插入!实际上我使用的是Guids。但问题是,使用此设置NH会在多对多表上创建多个删除和插入语句,先删除一行,然后再添加完全相同的行!!

有没有办法防止这种情况发生?

映射(使用Fluent 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,Name(唯一)和版本映射。

1 个答案:

答案 0 :(得分:0)

我发现了问题。在收藏品的制作者中,我创建了新的列表,显然这是NH无法做到的。我想将我的内部HashSets暴露为外部世界的IEnumerable,我认为这是首选的方法。在我受保护的这些集合中,我的代码如下:

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

我遇到的第二个问题是NH不支持原生dot net 4 ISet。您必须实现NH提供的集合(Iesi.Collections.Generic.ISet)。

发生的事情是因为我从NH提供的集合中创建了一个新的内部集合,NH认为,好吧,这不是同一个集合,因此,这个对象很脏,因此更新版本并开始级联这些更改。

我问的这个问题总结了我正在努力解决的困境但现在似乎已经解决了:Approach to handle business collections