我使用最新的流利NHibernate库(0.1.0.452),我有一个问题,保存子女实体。流利的NHibernate的HasMany不更新FK
我认为这是相当常见的场景...我已经得到了与映射父:
HasMany<Packet>(x => x.Packets)
.Cascade.All()
.KeyColumnNames.Add("OrderId");
和一个简单的包类(领域模型和FNH映射)没有任何参考父母。 生成的内容是包含名为OrderId的列的正确数据包表。 没有用的是保存。 每当我尝试保存父对象时,孩子也被保存,但FK保持不动。 我检查了SQL,并在INSERT语句中OrderId甚至没有出现!
INSERT INTO KolporterOrders (CargoDescription, SendDate, [more cols omitted]) VALUES ('order no. 49', '2009-04-22 00:57:44', [more values omitted])
SELECT LAST_INSERT_ID()
INSERT INTO Packets (Weight, Width, Height, Depth) VALUES ('To5Kg', 1, 1, 1)
SELECT LAST_INSERT_ID()
正如您所看到的,OrderId在上一个INSERT中完全缺失。
我还检查产生的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。
编辑2:上面的FNH映射生成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
});
}
会话被刷新,并在EndRequest关闭。
请显示负责创建和保存对象的C#代码(失败的代码)。 – yfeldblum 2009-04-22 00:10:31