我有一个叫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,名称(唯一的)和版本映射。