2010-11-30 49 views
1

我有以下架构,并且当我删除在许多方面的对象之一时,它似乎试图删除其他许多方面的对象。我对使用恰当的Cascade选项有些困惑,并且我没有发现Oren对它们的简要描述是有用的,所以请不要引用它们。流利的NHibernate与ManyToMany和自定义链接表

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

回答

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并没有试图打破它,但( - :

0

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