2010-11-30 31 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上關閉它。