我有一个名为 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 映射。