我有一个Product对象,它引用了一个有序的Specification对象列表。当产品更新时,相关的规格列表是.Clear()&d;并且重建(不是新的' d。)
Cascade.All()的问题在于,当产品更新时,它会在数据库中创建20个新的规范行,放弃20个旧的规范行。 Cascase.AllDeleteOrphans()抛出错误:
附加信息:cascade =" all-delete-orphan"所拥有的实体实例不再引用:Invax.Core.Models.Product.Specifications
虽然这是我想要发生的事情..但事实上,产品不再引用规范集合 - 所以删除这些,对吧?好吧,我已经尝试过Inverse()来允许规范对象本身处理关系,但它也没有工作。这是我当前的映射,它引发了上述错误。
产品图谱:
<div id="teamimg">
<img src="Images/picture.png" alt="Image" height="18" width="20" class="itemImg" style="float:left">
</div>
规范映射:
public class ProductMap : ClassMap<Product>
{
public ProductMap ()
{
Id(x => x.Id);
Map(x => x.CatalogId).Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.UrlSlug).Not.Nullable();
Map(x => x.ShortDescription).Not.Nullable();
Map(x => x.Description).Not.Nullable();
Map(x => x.ImageFileName);
HasMany(x => x.Specifications).Cascade.AllDeleteOrphan().KeyColumn("ProductId");
References(x => x.Category).Column("Category");
}
}
我对此问题的任何解决方案持开放态度,包括更强大的数据库设计或数据组织。我必须坚持使用列表,因为规格是以特定方式订购的。
答案 0 :(得分:2)
显然对你来说太迟了,但如果另一个人有这个问题。
您应该将Cascade设置为Cascade.AllDeleteOrphan()
因为
Cascade.All()
不会删除未引用的子对象。
答案 1 :(得分:0)
Inverse()
解决了这个问题。例如:
HasMany(x => x.Specifications).Cascade.AllDeleteOrphan().Inverse();