FluentNHibernateを使用して複合キーをマッピングしています。親が作成されたときに、新しく挿入された親キーを受け取るために子エンティティが必要です。これは機能しますが、NHibernateは子に対して挿入を実行し、その後、子の複合キーIDの1つに対して更新を実行します。
実体関連は次のとおりです。
1)モデル(親)-多くのFactorWeightsがあります。
2)FactorWeight(子)には1つのFactorがあります。
3)因子は、モデルごとに異なる重みを持つことができます。
モデルには多くのファクターがあり、ファクターはモデルごとに異なる重みを持つことができるため、FactorWeightエンティティにはModelIDとFactorIDの複合キーが必要です。
モデル:
public virtual int ID {get; セットする; } public virtual IList <FactorWeight> FactorWeights {get; セットする; } public virtual string Name {get; セットする; }
要素:
public virtual int ID {get; セットする; } public virtual string Name {get; セットする; }
FactorWeight:
public virtual Factor Factor {get; セットする; } パブリック仮想モデルモデル{取得; セットする; } public virtual decimal Weight {get; セットする; }
マッピングは次のとおりです。
モデル:
public void Override(AutoMapping <Model>マッピング) {{ mapping.Id(x => x.ID); mapping.Map(x => x.Name); mapping.HasMany(x => x.FactorWeights) .KeyColumn( "ModelID"); }
FactorWeights
public void Override(AutoMapping <FactorWeight>マッピング) {{ mapping.CompositeId() .KeyReference(factorWeight => factorWeight.Model、 "ModelID") .KeyReference(factorWeight => factorWeight.Factor、 "FactorID"); mapping.Map(factorWeight => factorWeight.Weight); }
次のコードを使用して、Modelオブジェクト内にFactorWeightを作成します。
Model.FactorWeights.Add(new FactorWeight {Factor = factor、Weight = weighting、Model = Model});
以下は、エンティティ(モデルがメソッドに渡される場所)を永続化するために使用されます。
public void CreateEntity(object entity) {{ HibernateConfiguration.Session.Transaction.Begin(); NHibernateConfiguration.Session.Save(entity); NHibernateConfiguration.Session.Transaction.Commit(); }
Modelエンティティは、FactorWeightと同様にエラーなしで保存されます。問題は、SQLプロファイラーが挿入直後にFactorWeight.ModelID列に更新を表示することです。NHibernateは、FactorWeight.ModelIDを、挿入にすでに存在していた新しく挿入されたModelIDで更新します。
SQlプロファイラートレース:
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
これは複合キーのマッピングの問題だと思います。
NHibernateのバージョン2.1.2.400とFluentNHibernateのバージョン1.1.0.685を使用しています。
ありがとうございました。