Fluent NHibernate有许多未更新FK的文件

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

我正在使用最新的Fluent NHibernate库(0.1.0.452),在保存子实体时遇到问题

我认为这是相当普遍的情况。。。我有一位具有映射功能的家长:

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代码。这也是我在设置测试项目时遇到的问题。谢谢