Fluent NHibernate有许多未更新FK的文件
我正在使用最新的Fluent NHibernate库(0.1.0.452),在保存子实体时遇到问题 我认为这是相当普遍的情况。。。我有一位具有映射功能的家长:Fluent NHibernate有许多未更新FK的文件,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我正在使用最新的Fluent NHibernate库(0.1.0.452),在保存子实体时遇到问题 我认为这是相当普遍的情况。。。我有一位具有映射功能的家长: HasMany<Packet>(x => x.Packets) .Cascade.All() .KeyColumnNames.Add("OrderId"); 如您所见,OrderId在最后一次插入中完全丢失 我还检查了生成的NH映射,看起来还可以: <bag nam
HasMany<Packet>(x => x.Packets)
.Cascade.All()
.KeyColumnNames.Add("OrderId");
如您所见,OrderId在最后一次插入中完全丢失
我还检查了生成的NH映射,看起来还可以:
<bag name="Packets" cascade="all">
<key column="OrderId" />
<one-to-many class="Company.Product.Core.Packet, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
我尝试将级联设置为不同的值。我甚至添加了对PacketMap(FNH映射类)的引用
知道为什么没有插入OrderId吗
编辑:忘了提一下:如果重要的话,我正在使用MySQL5
Edit2:上面的FNH映射生成带有bag的hbm(不是集合)-我编辑了它。
用于保存的C#代码:
var order = new Order();
NHSession.Current.SaveOrUpdate(order); //yes, order.Packets.Count == 1 here
///Order.cs, Order ctor
public Order()
{
CreateDate = DateTime.Now;
OrderState = KolporterOrderState.New;
Packets = new List<Packet>();
Packets.Add(new Packet()
{
Depth = 1,
Height = 1,
Width = 1,
Weight = PacketWeight.To5Kg
});
}
var order=新订单();
NHSession.Current.SaveOrUpdate(顺序)//是,这里的order.Packets.Count==1
///Order.cs,Order.ctor
公共秩序()
{
CreateDate=DateTime.Now;
OrderState=KolporterOrderState.New;
数据包=新列表();
Packets.Add(新数据包()
{
深度=1,
高度=1,
宽度=1,
重量=包装重量。至5kg
});
}
会话将在EndRequest时刷新并关闭。在“普通”父子对象模型中,必须更新子对象对父对象的引用,以使NHibernate更新子记录对父对象的引用
在“反向”父子对象模型中,必须修改父对象的子对象集合,以使NHibernate更新子记录对父对象的引用
您可能希望使用“反转”的父子对象模型
在XML映射中,您需要
<set name="Packets" cascade="all" inverse="true">
<key column="OrderId" />
<one-to-many class="Company.Product.Core.Packet, Core,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>
HasMany<Packet>(x => x.Packets)
.Cascade.All()
.Inverse()
.KeyColumnNames.Add("OrderId")
;
在Fluent映射中,您需要
<set name="Packets" cascade="all" inverse="true">
<key column="OrderId" />
<one-to-many class="Company.Product.Core.Packet, Core,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>
HasMany<Packet>(x => x.Packets)
.Cascade.All()
.Inverse()
.KeyColumnNames.Add("OrderId")
;
HasMany(x=>x.Packets)
.Cascade.All()
.Inverse()
.KeyColumnNames.Add(“订单ID”)
;
这真的很奇怪。您应该检查后续更新,NHibernate有时会在之后更新外键,然后它不会出现在插入中
确保OrderId在数据包表中没有多个含义。要检查这一点,请将OrderId的名称更改为其他名称
级联与此无关。它只控制您是否需要显式保存孩子。好的,我的错。我在global.asax的ApplicationStart中测试它,所以请求没有创建,所以会话没有刷新。当我在一个简单的ConsoleApp项目上测试它时,我意识到了这一点,当时我看到刷新实际上会导致FK列更新
无论如何:谢谢你的帮助 这实际上是我第一次尝试改变。这并没有解决问题。[F] NH不知何故忘记了OrderId。inverse=true让NHibernate忽略这个关系。因此,如果没有错误,这将是产生错误的方法:-)请显示负责创建和保存对象(失败的代码)的C代码。这也是我在设置测试项目时遇到的问题。谢谢