我在 NHibernate 中进行映射时遇到问题。
Order
表具有 Invoice_Id
列,该列对于 Invoice
表来说是可为空的 FK
。
问题是,当我加载 Order
表中存在 Id
的 Invoice
时,我看到 ConnectedOrder
code> 属性为 null,为什么?
public class Invoice
{
public virtual Order ConnectedOrder { get; set; }
}
public class Order
{
public virtual Invoice ConnectedInvoice { get; set; }
}
public class InvoiceMap : ClassMap<Invoice>
{
public InvoiceMap()
{
this.References(x => x.ConnectedOrder).Nullable();
}
}
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
this.References(x => x.ConnectedInvoice).Nullable();
}
}
编辑
我已经像 Radim Köhler 所说的那样更改了我的类和映射,然后我发现了该主题 Fluent NHibernate One-To-Many Mapping
并且还需要添加:
this.HasMany(x => x.Orders)
.KeyColumn("Invoice_id")
.Inverse()
.Cascade
.AllDeleteOrphan();
现在可以了
最佳答案
您可能不喜欢它,但上面描述的表结构并不代表您创建的实体关系(所谓的一对一
)。
如果一个表包含引用另一个表(FK)的列,我们有这样的场景:
- 每个订单只有一张(或空)发票。 (
多对一
) - 发票可以不被引用,也可以被一个或多个订单引用。 (
一对多
)
这意味着,我们应该这样表达实体:
public class Invoice
{ // many orders could reference us
public virtual IList<Order> Orders { get; set; }
...
public class Order
{ // unchanged
public virtual Invoice ConnectedInvoice { get; set; }
...
映射应该是:
public InvoiceMap()
{ // HasMany is one-to-many
this.HasMany(x => x.Orders)
...
}
public OrderMap()
{ // References is many-to-one
this.References(x => x.ConnectedInvoice).Nullable();
...
关于NHibernate 映射返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28342609/