1

私はレガシーシステムに取り組んでおり、それを休止状態に移植中です。

このシステムは、生成された「エンティティ」C# クラスと、特別な「リンク」クラスでクロスエンティティ参照をラップすることに基づくデータ アクセス インフラストラクチャに基づいています。これは、遅延読み込みを実装するための誤った試みであり、実際には役立つよりも害が大きくなります。

例:

public class Order
{
    public Guid Id { get; protected set;}
    public int Total {get; set;}
    public Link<Customer> Customer {get; set;}
}

public class Customer
{
    public Guid Id { get; protected set;}
    public string Name {get; set;}
}

public class Link<T>
{
   ... Snip ...
   public T Entity { get; private set;}
}

order テーブルでは、"Customer" 列が標準の外部キーです。

これは、システム全体で、これらの「エンティティ」を使用するすべての作業が次の形式を取ることを意味します。

if (Order.Customer != null)
{
    if (Order.Customer.Entity != null)
    {
        // Do stuff
    }
}

多くの調査の結果、nhibernate のクエリ機能を適切に使用できる方法でこれらのクラスをマップする方法を見つけることができませんでした。私が見つけた最も近い解決策は、IPropertyAccessorインターフェイスです。これは、マッピングの問題を解決する可能性がありますが、クエリではうまく機能しません。

いくつかのメモ: 1) 残念ながら、リンク ラッパー クラスの主な問題はここに残っています。レガシー インフラストラクチャ全体を書き直さない限り、この問題を取り除くことはできません。2) コード生成テンプレートに完全にアクセスでき、必要に応じてエンティティ クラスの構造を変更できます。たとえば、別の主要な問題を修正するために、エンティティごとに poco のようなインターフェイスを生成しました。設定;} ... }

public class Order : IOrder
{
    ...
    public Link<Customer> Customer {get; set;}
    ICustomer IOrder.Customer
    {
       (Adapting code here)
    } 
    ...
}

要するに、NH の達人からのヒントは大歓迎です。

4

1 に答える 1

0

コメントできないので、問題の解決に役立つこのリンクを共有します。リンクの考えられるすべての用途をマップする必要があると思いますが、NHibernate では想定されていないため、多くの制限があります。

于 2012-06-18T15:22:06.753 に答える