NH保存子集合时外键为空

时间:2010-10-21 06:23:09

标签: nhibernate fluent-nhibernate

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

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

关系分析非常简单: alt text

日志是主要实体。他与表格有一对一的关系。 外键是 FormID

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

问题是由买方和买方组成的主键。卖方实体。 来自ForegineKey- 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

当我尝试通过编辑操作保存实体时出现问题 我正在使用MVC获取用户数据并使其成为对象。 绑定工作正常,并使对象与集合一起。

但是当我保存实体时会收到以下错误: alt text

我希望NHibernate足够聪明,可以设置买家和购买者。卖家外键。 但实际上它们仍然没有价值。

可以通过手动设置外键来解决问题 如下代码:

        //i have to set the form proerty in the childs
        //without of the lines NH will try to save the childs it with FormID = null
        foreach (var buyer in form.Buyers) { buyer.Form = form; }
        foreach (var seller in form.Sellers) { seller.Form = form; }

但我正在寻找一个优雅而正确的解决方案

感谢您阅读

2 个答案:

答案 0 :(得分:1)

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

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

因为Form是关系的反面,所以你必须在多方面设置Form的引用。无论如何你应该这样做,以便内存中的对象是正确的。如果买方和卖方对象已经在同一个ISession中持久存在,那么

答案 1 :(得分:0)

根据this相关问题,HHibernate不支持级联使用复合键(正如BuyerMap中所述)。其中一个答案确实包含hack以解决此问题,但您最终会得到一个冗余列。