NHibernate 映射返回空值

标签 nhibernate fluent-nhibernate nhibernate-mapping

我在 NHibernate 中进行映射时遇到问题。

Order 表具有 Invoice_Id 列,该列对于 Invoice 表来说是可为空的 FK

问题是,当我加载 Order 表中存在 IdInvoice 时,我看到 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/

相关文章:

c# - 是否存在 NHibernate 不返回代理对象的情况?

c# - 将 Linq 设置为 NHibernate ADO 命令超时

fluent-nhibernate - 在哪里可以找到Fluent NHibernate教程?

nhibernate - Fluent NHibernate AutoMapping SchemaExport - 更改对象模型和保存数据

NHibernate,通过父级添加子级与在子级上设置对父级的引用

c# - 有没有办法反编译 NHibernate 生成的动态代理类?

c# - 从 Fluent NHibernate 中的种子表生成身份

fluent-nhibernate - NHibernate 中的空值对象

nhibernate - 如何使用 fluentNHibernate 映射 NHibernate 自定义集合?

c# - Fluent NHibernate - 如何使用鉴别器创建每个子类的表映射?