我有以下架构,当我删除其中一个对象时,它似乎试图删除另一方面的对象。我对使用适当的Cascade选项感到有些困惑,我没有发现Oren对它们的简要描述是有用的,所以请不要引用它们。
public class Store {
public virtual IList<StoreProduct> StoreProducts { get; set; }
}
public class Product {
public virtual IList<StoreProduct> StoreProducts { get; set; }
}
public class StoreProduct {
public virtual Store Store { get; set; }
public virtual Product Product { get; set; }
public virtual Decimal Cost { get; set; } //this is why I have a custom linking class
}
在我的映射覆盖中,我有:
对于商店:
mapping.HasMany(x => x.StoreProducts).Cascade.AllDeleteOrphan().Inverse;
对于产品:
mapping.HasMany(x => x.StoreProducts).Cascade.AllDeleteOrphan().Inverse;
当我尝试删除具有关联StoreProducts的商店时,似乎NHIbernate不仅尝试删除StoreProducts,还删除产品。
以下是我的惯例:
return c =>
{
c.Add<ForeignKeyConvention>();
c.Add<HasManyConvention>();
c.Add<HasManyToManyConvention>();
c.Add<ManyToManyTableNameConvention>();
c.Add<PrimaryKeyConvention>();
c.Add<ReferenceConvention>();
c.Add<EnumConvention>();
c.Add<TableNameConvention>();
c.Add<CascadeAll>();
c.Add(DefaultCascade.All());
};
HasManyConvention:
public void Apply(IOneToManyCollectionInstance instance)
{
instance.Key.Column(instance.EntityType.Name + "Fk");
instance.Cascade.AllDeleteOrphan();
instance.Inverse();
}
我做错了什么?
谢谢!
p.s。:我不想用代码压倒人,但如果需要可以发布更多。
答案 0 :(得分:1)
谢谢,CrazyDart - 我认为这是我尝试过的事情之一,没有成功。我最终做的是添加一个StoreProducts覆盖,如下所示:
public class StoreProductOverride: IAutoMappingOverride<StoreProduct>
{
#region IAutoMappingOverride<StoreProduct> Members
public void Override(AutoMapping<IndicatorStrategy> mapping)
{
mapping.References(x => x.Store).ForeignKey("StoreFk").Cascade.SaveUpdate();
mapping.References(x => x.Producty).ForeignKey("ProductFk").Cascade.SaveUpdate();
}
#endregion
}
似乎工作,但QA还没有尝试打破它( - :
答案 1 :(得分:0)
你需要关闭StoreProduct上的级联是我的猜测。没有设置它很难测试。我在Store和Product上看到了级联,但在StoreProduct上将其关闭。