背景:我正在连接到具有两个实体的 旧版 数据库:
Order (Id, Date, ...)
ForwardOrder(OrderId)
...正如您所见,ForwardOrder可能只是订单的属性
要求:尝试将ForwardOrder反映为.NET中Order类的布尔属性。使用NHibernate连接到数据库。
问题:我尝试实现IUserType但没有运气 - 列不存在错误。
映射为Map(x=>x.IsForwardOrder).CustomType<ForwardOrderType>();
添加公式确实可以正确加载,但永远不会使用IUserType setter。
问题:可以吗?对象在单独的表中是否可以作为我的实体上的标志?我知道我可以只绘制相关对象,但我宁愿避免这种情况。
答案 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
)