使用NHibernate将对象的存在映射到布尔属性

时间:2012-09-11 11:57:02

标签: c# .net nhibernate nhibernate-mapping

背景:我正在连接到具有两个实体的 旧版 数据库:

Order (Id, Date, ...)    

ForwardOrder(OrderId)

...正如您所见,ForwardOrder可能只是订单的属性

要求:尝试将ForwardOrder反映为.NET中Order类的布尔属性。使用NHibernate连接到数据库。

问题:我尝试实现IUserType但没有运气 - 列不存在错误。

映射为Map(x=>x.IsForwardOrder).CustomType<ForwardOrderType>();

添加公式确实可以正确加载,但永远不会使用IUserType setter。

问题:可以吗?对象在单独的表中是否可以作为我的实体上的标志?我知道我可以只绘制相关对象,但我宁愿避免这种情况。

1 个答案:

答案 0 :(得分:1)

执行此操作的方法是将ForwardOrder设置为代码级别的受保护属性,并将其视为惰性组件。然后你可以将IsForwardOrder完全从你的NHibernate映射中删除,然后执行以下操作:

  public bool IsForwardOrder { get { return ReferenceEquals(this.ForwardOrder,null); } }

也可以使用多态,但对布尔值来说似乎有些过分。这种方法需要创建一个具有ForwardOrder属性并为ForwardOrder表定义table-per-subclass join的子类。您仍然需要定义一个布尔属性,如

  public virtual bool IsForwardOrder { get { return false; } }

在基类

  public override bool IsForwardOrder { get { return true; } }

在连接的子类上。

或者,使用此方法,您可以使用扩展方法,例如

 public static bool IsForwardOrder(this Order order) { return order is ForwardOrder; }

(假设基类为Order且子类为ForwardOrder