我尝试将NHibernate映射到现有的数据库结构。不幸的是我无法改变现有结构。
首先,我将给出一些背景知识,然后解释问题本身
关系分析非常简单:
日志是主要实体。他与表格有一对一的关系。 外键是 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获取用户数据并使其成为对象。 绑定工作正常,并使对象与集合一起。
但是当我保存实体时会收到以下错误:
我希望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; }
但我正在寻找一个优雅而正确的解决方案
感谢您阅读