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

Deleting child objects in HasMany() NHibernate relationship

我有一个引用规范对象的有序列表的产品对象。当产品更新时,相关的规范列表是 .Clear()' 和重建的(不是新的。)

Cascade.All() 的问题是,当更新产品时,它会在数据库中创建 20 个新的规范行,而放弃 20 个旧的。 Cascase.AllDeleteOrphans() 抛出错误:

Additional information: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Invax.Core.Models.Product.Specifications

尽管这是我希望发生的事情..的确,产品不再引用规格集合——所以删除这些,对吗?好吧,我已经尝试过 Inverse() 来允许 Specification 对象自己处理关系,但它也没有用。这是我当前的映射,它引发了上述错误。

产品映射:

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");
   }
}

规范映射:

class SpecificationMap : ClassMap<Specification>
{
    public SpecificationMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Value);
        References(x => x.Product).Column("ProductReferenceId").Cascade.All();
    }
}

我愿意接受解决此问题的任何方法,包括更强大的数据库设计或数据组织。我必须坚持使用列表,因为规格是按特定方式排序的。

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

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

Ayende: Difference between cascades

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

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