0

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

Order (Id, Date, ...)    

ForwardOrder(OrderId)

...如您所见, ForwardOrder 可能只是 Order 的一个属性

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

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

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

添加公式确实可以正确加载,但从未使用过 IUserType 设置器。

问题:可以做到吗?一个对象在单独的表中的存在可以成为我的实体上的标志吗?我知道我可以只映射一个相关的对象,但我宁愿避免这种情况。

4

1 回答 1

1

这样做的方法是ForwardOrder在代码级别将其设置为受保护的属性,并将其视为惰性组件。然后,您实际上可以完全忽略IsForwardOrder您的 NHibernate 映射,而只需执行以下操作:

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

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

  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

于 2012-09-11T12:06:54.363 回答