在HasMany()NHibernate关系中删除子对象

时间:2015-07-23 19:37:36

标签: nhibernate database-design fluent-nhibernate

我有一个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");
   }
}

我对此问题的任何解决方案持开放态度,包括更强大的数据库设计或数据组织。我必须坚持使用列表,因为规格是以特定方式订购的。

2 个答案:

答案 0 :(得分:2)

显然对你来说太迟了,但如果另一个人有这个问题。

您应该将Cascade设置为Cascade.AllDeleteOrphan()因为 Cascade.All()不会删除未引用的子对象。

Ayende: Difference between cascades

答案 1 :(得分:0)

Inverse()解决了这个问题。例如:

HasMany(x => x.Specifications).Cascade.AllDeleteOrphan().Inverse();