1

我有一个名为 Shape 的类,它与 Package 有多对多的关系。这种双向关系的含义是,如果一个Product具有某个Shape,那么它可以被该Shape关联的Packages打包。这也适用于相反的情况,如果产品由 Package 打包,这意味着 Product 应该是与此 Package 关联的 Shape。

因此,我有一个域模型,其中包含包含包的形状和包含形状的包。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(唯一)和 Version 映射。

4

1 回答 1

0

我发现了问题。在集合的设置器中,我创建了新列表,显然这是你不能用 NH 做的。我想将我的内部 HashSets 作为 IEnumerable 暴露给外界,我认为这是首选的方式。在这些集合的受保护设置器中,我有如下代码:

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

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

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

我问的这个问题总结了我一直在努力但现在似乎已经解决的困境:处理业务收款的方法

于 2011-08-25T08:57:52.123 回答