1

Ich verwende Fluent NHibernate, um einen zusammengesetzten Schlüssel zuzuordnen. Ich benötige die untergeordnete Entität, um den neu eingefügten übergeordneten Schlüssel zu erhalten, wenn das übergeordnete Element erstellt wird. Dies funktioniert, aber NHibernate führt eine Einfügung für das untergeordnete Element durch und führt danach eine Aktualisierung für eine der zusammengesetzten Schlüssel-IDs für das untergeordnete Element durch.Fluent NHibernate führt eine Aktualisierung nach einem Einfügen auf einem zusammengesetzten Schlüssel durch

Die Entität Beziehungen sind wie folgt:

1) Modell (Eltern) - viele FactorWeights hat.
2) FactorWeight (Kind) hat einen Faktor.
3) Faktoren können unterschiedliche Gewichte pro Modell haben.

Da Modelle viele Faktoren haben und der Faktor unterschiedliche Gewichtungen für verschiedene Modelle haben kann, wird die FactorWeight-Entität mit dem zusammengesetzten Schlüssel von ModelID und FactorID benötigt.

Modell:

 
    public virtual int ID { get; set; } 
    public virtual IList<FactorWeight> FactorWeights { get; set; } 
    public virtual string Name { get; set; }  

Factor:

 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

FactorWeight:

 
    public virtual Factor Factor { get; set; } 
    public virtual Model Model { get; set; } 
    public virtual decimal Weight { get; set; } 

Die Zuordnungen sind wie folgt:

Modell:

 
public void Override(AutoMapping<Model> mapping) 
{ 
mapping.Id(x => x.ID); 
mapping.Map(x => x.Name); 

mapping.HasMany(x => x.FactorWeights) 
    .KeyColumn("ModelID"); 
} 

FactorWeights

 
public void Override(AutoMapping<FactorWeight> mapping) 
{ 
mapping.CompositeId() 
      .KeyReference(factorWeight => factorWeight.Model, "ModelID") 
      .KeyReference(factorWeight => factorWeight.Factor, "FactorID"); 

mapping.Map(factorWeight => factorWeight.Weight); 
} 

ich den folgenden Code verwenden, um die FactorWeight innerhalb des Model-Objekt zu erstellen:

 
Model.FactorWeights.Add(new FactorWeight {Factor = factor, Weight = weighting, Model = Model }); 

Die folgenden verwendet wird, um die Einheit bestehen bleiben (wo das Modell zu übergeben die Methode):

 
public void CreateEntity(object entity) 
{ 
HibernateConfiguration.Session.Transaction.Begin(); 
NHibernateConfiguration.Session.Save(entity); 
NHibernateConfiguration.Session.Transaction.Commit(); 
} 

Das Modell Entity wird ohne Fehler gespeichert, ebenso wie FactorWeight. Das Problem besteht darin, dass SQL Profiler unmittelbar nach dem Einfügen ein Update für die FactorWeight.ModelID-Spalte anzeigt. NHibernate aktualisiert die FactorWeight.ModelID mit der neu eingefügten ModelID, die bereits in der Einfügung vorhanden war.

SQL Profiler Trace:

 
exec sp_executesql N'INSERT INTO [FactorWeight] (Weight, ModelID, FactorID) VALUES (@p0, @p1, @p2)',N'@p0 decimal(1,0),@p1 int,@p2 int',@p0=1,@p1=56,@p2=1 
exec sp_executesql N'UPDATE [FactorWeight] SET ModelID = @p0 WHERE ModelID = @p1 AND FactorID = @p2',N'@p0 int,@p1 int,@p2 int',@p0=56,@p1=56,@p2=1 

Ich nehme an, das ein Problem mit der Abbildung des zusammengesetzten Schlüssels ist.

Ich verwende Version 2.1.2.400 von NHibernate und Version 1.1.0.685 von FluentNHibernate.

Vielen Dank.

Antwort

1

Ok, ich denke, ich muss meine Googling-Fähigkeiten verbessern ... fand die Anwers hier: Is it possible to suppress the Update after Insert in NHibernate?.

Es stellte sich heraus, dass ich Inverse() zum Mapping auf dem Eltern hinzufügen musste.Hinzugefügt wurde die folgende und Problem gelöst:

 
    mapping.HasMany(x => x.FactorWeights) 
    .KeyColumn("ModelID") 
    .Inverse(); 

Inverse erzählt die Eltern, dass das Kind für die Aufrechterhaltung der Beziehung verantwortlich ist für die zusätzliche Update verhindert“ - von Link oben.

Verwandte Themen