1

我使用Fluent NHibernate映射覆合鍵。當創建父項時,我需要子實體接收新插入的父項。這可以工作,但NHibernate正在對子進行插入操作,然後對子進程上的某個組合鍵ID進行更新。Fluent NHibernate插入複合鍵後進行更新

的實體關係如下:

1)模型(母) - 有許多FactorWeights。
2)FactorWeight(孩子)有一個因子。
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); 
} 

我使用下面的代碼來創建模型對象中的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 Profiler在插入後立即在FactorWeight.ModelID列上顯示更新。 NHibernate使用插入中已經存在的新插入的ModelID更新FactorWeight.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(); 

逆告訴父母,孩子是負責維護的關係,從而防止額外的更新」 - 從以上鍊接。