我使用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版本。
謝謝。