1

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を使用しています。

ありがとうございました。

4

1 に答える 1

1

わかりました、グーグルのスキルを向上させる必要があると思います...ここで答えを見つけました:NHibernateに挿入した後に更新を抑制することは可能ですか? .

親のマッピングに Inverse() を追加する必要があることがわかりました。以下を追加し、問題を解決しました。

    mapping.HasMany(x => x.FactorWeights)
    .KeyColumn("モデル ID")
    .逆();  

逆は、子供が関係を維持する責任があることを親に伝え、余分な更新を防ぎます」-上記のリンクから。

于 2011-01-05T16:26:33.547 に答える