删除 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()
不删除未引用的子对象。
Inverse()
解决了问题。例如:
HasMany(x => x.Specifications).Cascade.AllDeleteOrphan().Inverse();
我有一个引用规范对象的有序列表的产品对象。当产品更新时,相关的规范列表是 .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()
不删除未引用的子对象。
Inverse()
解决了问题。例如:
HasMany(x => x.Specifications).Cascade.AllDeleteOrphan().Inverse();