0

背景: 2 つのエンティティを持つレガシーデータベースに接続しています。

Order (Id, Date, ...)    

ForwardOrder(OrderId)

...ご覧のとおり、ForwardOrderはOrderの単なるプロパティである可能性があります

要件: ForwardOrder を .NET の Order クラスの Boolean プロパティとして反映するようにしてください。Hibernate を使用してデータベースに接続します。

問題: IUserType を実装しようとしましたが、運がありません - 列が存在しないというエラーが発生しました。

マッピングはMap(x=>x.IsForwardOrder).CustomType<ForwardOrderType>();

Formula を追加すると正しく読み込まれますが、IUserType セッターは使用されません。

質問:それはできますか?別のテーブルにあるオブジェクトの存在は、エンティティのフラグになる可能性がありますか? 関連オブジェクトをマップできることはわかっていますが、それは避けたいと思います。

4

1 に答える 1

1

これを行う方法は、コード レベルで保護されたプロパティとして設定しForwardOrder、遅延コンポーネントのように扱うことです。次に、実際にIsForwardOrderNHibernateマッピングを完全に除外して、次のようなことを行うことができます:

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

ポリモーフィズムも使用できますが、ブール値としてはやり過ぎのようです。この方法では、ForwardOrder プロパティを持つサブクラスを作成し、サブクラスごとのテーブル結合をテーブルに定義する必要があり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 に答える