1

Fluent NHibernateを使用して複合キーをマッピングしています。親が作成されたときに、新しく挿入された親キーを受け取るために子エンティティが必要です。これは動作しますが、NHibernateは子に対して挿入を行い、その後子の複合キーIDの1つを更新します。多くのFactorWeightsを持っている -Fluent NHibernateは複合キーの挿入後に更新を行います

1)モデル(親):次のように

エンティティ関係があります。
2)FactorWeight(子)には1つのFactorがあります。
3)因子ごとにモデルごとに異なる重み付けをすることができます。

モデルには多くのファクタがあり、ファクタは異なるモデルに対して異なる重み付けを持つことができるため、FactorWeightエンティティはModelIDとFactorIDの複合キーで必要です。

モデル:

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

ファクタ:

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

次のようなマッピングは、次のとおりです。

モデル:

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

Iは、モデルオブジェクト内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(); 
} 

モデルエンティティは、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を使用しています。

ありがとうございます。

答えて

1

私は、私のグーグルのスキルを向上させる必要があると思う...アンカーをここに見つけた:Is it possible to suppress the Update after Insert in NHibernate?

私はInverse()を親のマッピングに追加する必要がありました。以下、問題解決を追加しました: - 上記のリンクから

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

逆に子供は、このような関係を保ち、余分な更新を防止する責任があることを親に伝えます」。

関連する問題