【问题标题】:Fluent NHibernate with ManyToMany and Custom Link Table具有多对多和自定义链接表的流畅 NHibernate
【发布时间】:2010-11-30 19:52:58
【问题描述】:

我有以下架构,当我删除一侧的对象之一时,它似乎试图删除另一侧的对象。我对使用正确的 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 的 Store 时,NHIbernate 似乎不仅尝试删除 StoreProducts,还尝试删除 Products。

这是我的约定:

 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.:我不想用代码压倒人们,但如果需要可以发布更多内容。

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案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 尚未尝试破坏它(-:

    【讨论】:

      【解决方案2】:

      我猜你需要关闭 StoreProduct 上的级联。没有设置就很难测试。我在 Store 和 Product 上看到了级联,但在 StoreProduct 上将其关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多