【问题标题】:Mapping a property to a field from another table in NHibernate在 NHibernate 中将属性映射到另一个表中的字段
【发布时间】:2010-03-20 22:59:40
【问题描述】:

考虑以下类:

class Order {
    int OrderId {get; set;}
    int CustomerId {get; set;}
    string CustomerName {get; set;}
    //other fields go here
}

映射到 Orders 表。是否可以通过外键关系将属性 CustomerName 映射到 Customers 表?

【问题讨论】:

  • 我决定暂时使用视图。

标签: nhibernate hibernate hibernate-mapping


【解决方案1】:

是的,您可以为此使用join 映射元素。另一种选择是映射视图而不是表。但如果可能,您应该采用面向对象的方法并映射 Order 和 Customer 之间的多对多关系。

【讨论】:

  • 您能否详细解释一下连接映射元素?外键在 Order 类/表中,而不是在您提供的示例页面中的其他表中。
【解决方案2】:

我强烈建议您不要为此使用<join/>。虽然它会完成您的要求,但它会产生其他问题。

相反,订单应该与客户建立关系。然后,您可以根据需要投影名称,尽管使用 order.Customer.Name 更容易。

所以,归结为:

1) 将Customer 属性添加到Order

public virtual Customer Customer { get; set; }

2) 映射属性(在示例中,CustomerId 是 FK 列的名称)

<many-to-one name="Customer" column="CustomerId"/>

3) 如果您特别想拥有CustomerName 属性,请从客户那里投影:

public virtual string CustomerName { get { return Customer.Name; } }

【讨论】:

  • 这是我现在拥有的,但是效率不高;它必须读取整个客户记录才能显示名称。
  • 如果你启用缓存客户实例,它会比加入更有效。
  • NHibernate 支持缓存吗?还是我必须自己实现?
  • 我无法弄清楚如何为此使用连接。根据关于 Join (docs.jboss.org/hibernate/core/3.3/reference/en/html/…) 的文档,外键应该在您引用的表中,但在我的情况下,外键在同一个表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多