2010-11-30 11 views
1

Ich habe das folgende Schema, und wenn ich eines der Objekte auf einer der vielen Seite lösche, scheint es zu versuchen, die Objekte auf der anderen Seite zu löschen. Bin ein wenig verwirrt über die richtigen Cascade-Optionen zu verwenden, und ich finde nicht Oren kurze Beschreibung von ihnen, um nützlich zu sein, also bitte nicht diese zurück zitieren.Fließend NHibernate mit ManyToMany und benutzerdefinierte Verknüpfungstabelle

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 
} 

In meiner Mapping Überschreibung, die ich habe:

Für Store:

mapping.HasMany(x => x.StoreProducts).Cascade.AllDeleteOrphan().Inverse; 

für Produkt:

mapping.HasMany(x => x.StoreProducts).Cascade.AllDeleteOrphan().Inverse; 

Wenn ich versuche, einen Laden zu löschen, die StoreProducts zugeordnet ist, Es scheint, dass NHIbernate versucht, nicht nur die StoreProducts, sondern auch die Produkte zu löschen.

Hier sind meine Konventionen:

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(); 
} 

Was mache ich falsch?

Danke!

ps. .: Ich möchte nicht Menschen mit Code zu überwältigen, kann aber mehr posten, wenn nötig.

Antwort

1

Danke, CrazyDart - Ich denke, das ist unter den Dingen, die ich ohne Erfolg versuchte. Was ich am Ende war dabei eine StoreProducts Überschreibung hinzufügen, die wie folgt aussieht:

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 
} 

scheint zu funktionieren, aber QA versucht hat, es nicht zu brechen noch (-:

0

Sie müssen die Kaskadierung auf StoreProduct ausschalten, ist meine Vermutung. Es ist schwer zu testen, ohne es einzurichten. Ich sehe die Kaskade in Store und Produkt, schalte sie aber auf StoreProduct aus.

Verwandte Themen