Nhibernate 保存childs集合时,外键为null

Nhibernate 保存childs集合时,外键为null,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我尝试将NHibernate映射到现有的数据库结构。不幸的是,我无法更改现有结构 首先,我将介绍一些背景知识,然后解释问题本身 关系分析非常简单: Log是主要实体。他与表单有一对一的关系。 外键是FormID 买方和卖方是表格实体的集合。 应用程序应与买家和卖家一起保存表单实体 问题是由买方和卖方实体组成的主键。 键组合来自foregenekey-FormID和内部排序整数-tdNum 这反映在以下形式的FNH映射中 public class FormLogMap : ClassMap<

我尝试将NHibernate映射到现有的数据库结构。不幸的是,我无法更改现有结构

首先,我将介绍一些背景知识,然后解释问题本身

关系分析非常简单:

Log是主要实体。他与表单有一对一的关系。 外键是FormID

买方和卖方是表格实体的集合。 应用程序应与买家和卖家一起保存表单实体

问题是由买方和卖方实体组成的主键。 键组合来自foregenekey-FormID和内部排序整数-tdNum

这反映在以下形式的FNH映射中

public class FormLogMap : ClassMap<FormLog>
{
    public FormLogMap()
    {
        Table("BillOfSaleLog");

        Id(x => x.FormId).Column("FormID").GeneratedBy.Native();
        ....
        ....
        References<Form>(x => x.Form, "FormID").LazyLoad().ReadOnly();
    }
}

public class FormMap : ClassMap<Form>
{
    public FormMap()
    {

    Table("BillOfSaleForm");

        Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log");
        ...
        ...

        HasOne<FormLog>(x => x.Log).Cascade.All();

        HasMany(x => x.Buyers).KeyColumn("FormID").Inverse().Cascade.All();

        HasMany(x => x.Sellers).KeyColumn("FormID").Inverse().Cascade.All();
    }
}


public class BuyerMap : ClassMap<Buyer>
{
    public BuyerMap()
    {

        Table("BillOfSaleBuyer");

        CompositeId()
                    .KeyReference(x => x.Form, "FormID")
                    .KeyProperty(x => x.InnerOrderId, "tdNum1");

         ....
         ....
    }
}

Seller is exectly the same
但我正在寻找一个优雅而正确的解决方案


感谢您阅读

根据相关问题,HHibernate不支持使用复合键进行级联操作(正如您在
BuyerMap
中所做的那样)。其中一个答案确实包含解决此问题的方法,但您将得到一个多余的列。

您没有显示将买家或卖家添加到表单中的代码,但它应该如下所示:

form.Buyers.Add(buyer);
buyer.Form = form;

因为表单是关系的反面,所以必须在多方面设置对表单的引用。无论如何,您都应该这样做,以便内存中的对象是正确的。如果买方和卖方对象已在同一个会话中持久化,则该操作应有效。

感谢您的重播。我理解建议的解决方案,但需要更改表格模式。我将采用上面提出的解决方案。可以理解的是,映射笨拙的关系结构的能力是一个问题。我在上面提到,我从编辑视图通过数据绑定获得的表单对象。我并不是通过代码来创建表单对象实例的,这些代码在对象之间进行引用是一个小问题。另一个选项是除了视图中的卖方/买方信息之外,还包括父表的外键。解决这个问题很简单。太糟糕了。。
form.Buyers.Add(buyer);
buyer.Form = form;