流畅的NHibernate与ManyToMany和自定义链接表

时间:2010-11-30 19:52:59

标签: fluent-nhibernate

我有以下架构,当我删除其中一个对象时,它似乎试图删除另一方面的对象。我对使用适当的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。:我不想用代码压倒人,但如果需要可以发布更多。

2 个答案:

答案 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上将其关闭。