Fluent nhibernate Fluent NHibernate在插入复合键后执行更新

Fluent nhibernate Fluent NHibernate在插入复合键后执行更新,fluent-nhibernate,nhibernate-mapping,composite-key,composite-id,Fluent Nhibernate,Nhibernate Mapping,Composite Key,Composite Id,我正在使用Fluent NHibernate映射复合键。我需要子实体在创建父实体时接收新插入的父密钥。这是可行的,但NHibernate正在子级上进行插入,然后在子级上的一个复合密钥ID上进行更新 实体关系如下所示: 1) 模型(父级)-具有许多因子权重。 2) 因子权重(子项)有一个因子。 3) 每个模型的因子可以有不同的权重 由于模型有许多因子,并且因子对于不同的模型可以有不同的权重,因此需要FactorWeight实体,复合键为ModelID和FactorID 型号: public vir

我正在使用Fluent NHibernate映射复合键。我需要子实体在创建父实体时接收新插入的父密钥。这是可行的,但NHibernate正在子级上进行插入,然后在子级上的一个复合密钥ID上进行更新

实体关系如下所示:

1) 模型(父级)-具有许多因子权重。
2) 因子权重(子项)有一个因子。
3) 每个模型的因子可以有不同的权重

由于模型有许多因子,并且因子对于不同的模型可以有不同的权重,因此需要FactorWeight实体,复合键为ModelID和FactorID

型号:

public virtual int ID { get; set; } public virtual IList<FactorWeight> FactorWeights { get; set; } public virtual string Name { get; set; } 公共虚拟整数ID{get;set;} 公共虚拟IList因子权重{get;set;} 公共虚拟字符串名称{get;set;} 因素:

public virtual int ID { get; set; } public virtual string Name { get; set; } 公共虚拟整数ID{get;set;} 公共虚拟字符串名称{get;set;} 因子权重:

public virtual Factor Factor { get; set; } public virtual Model Model { get; set; } public virtual decimal Weight { get; set; } 公共虚拟因子{get;set;} 公共虚拟模型模型{get;set;} 公共虚拟十进制权重{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"); } 公共无效替代(自动映射) { map.Id(x=>x.Id); Map.Map(x=>x.Name); mapping.HasMany(x=>x.FactorWeights) .KeyColumn(“ModelID”); } 因子权重

public void Override(AutoMapping<FactorWeight> mapping) { mapping.CompositeId() .KeyReference(factorWeight => factorWeight.Model, "ModelID") .KeyReference(factorWeight => factorWeight.Factor, "FactorID"); mapping.Map(factorWeight => factorWeight.Weight); } 公共无效替代(自动映射) { mapping.CompositeId() .KeyReference(factorWeight=>factorWeight.Model,“ModelID”) .KeyReference(factorWeight=>factorWeight.Factor,“FactorID”); Map(factorWeight=>factorWeight.Weight); } 我使用以下代码在模型对象中创建因子权重:

Model.FactorWeights.Add(new FactorWeight {Factor = factor, Weight = weighting, Model = Model }); Model.FactorWeights.Add(新的FactorWeight{Factor=Factor,Weight=weights,Model=Model}); 以下内容用于持久化实体(其中模型被传递给方法):

公共void CreateEntity(对象实体) { HibernateConfiguration.Session.Transaction.Begin(); NHibernateConfiguration.Session.Save(实体); NHibernateConfiguration.Session.Transaction.Commit(); } 保存模型实体时不会出现错误,也不会出现因子权重。问题在于,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 exec sp_executesql N'插入[FactorWeight](权重、模型ID、因子D)值(@p0、@p1、@p2)')、N'@p0十进制(1,0)、@p1 int、@p2 int',@p0=1、@p1=56、@p2=1 exec sp_executesql N'UPDATE[FactorWeight]SET ModelID=@p0其中ModelID=@p1和FactorID=@p2',N'@p0int,@p1int,@p2int',@p0=56,@p1=56,@p2=1 我假设这是复合键映射的问题

我使用的是NHibernate的2.1.2.400版和FluentNHibernate的1.1.0.685版


谢谢。

好的,我想我需要提高我的谷歌搜索技能……在这里找到了anwser:

结果是我需要将Inverse()添加到父对象上的映射中。添加了以下内容并解决了问题:

mapping.HasMany(x => x.FactorWeights) .KeyColumn("ModelID") .Inverse(); mapping.HasMany(x=>x.FactorWeights) .KeyColumn(“ModelID”) .Inverse();
“反向告诉家长,孩子有责任维护关系,从而防止额外的更新”-来自上面的链接。

好的,我想我需要提高我的谷歌搜索技能…在这里找到答案:

结果是我需要将Inverse()添加到父对象上的映射中。添加了以下内容并解决了问题:

mapping.HasMany(x => x.FactorWeights) .KeyColumn("ModelID") .Inverse(); mapping.HasMany(x=>x.FactorWeights) .KeyColumn(“ModelID”) .Inverse(); “反向告诉父级,子级负责维护关系,从而防止额外的更新”-来自上面的链接