1

ado.net に基づくビジネス オブジェクト (クラス) の既存の (レガシー) セットがあります。それらには、SQL サーバーから自分自身をロードするメソッドと、自分自身を保存するメソッドがあります。これは、EF や linq2sql よりもずっと前から存在していました。

私は EF とそれが提供するすべての利点を使用したいと考えています。問題は、自分自身をロードするロジックを実装するクラスが、ado.net 値をそのプロパティにマップするカスタム ロジックを使用していることです。たとえば、「T」および「F」文字を使用して bool にマップしたり、コレクションにマップする CSV 値を引き出したり、varchar 値を Enum にマップしたりできます。.Load() メソッドでそれを行うのは問題ありません。それを行うためのロジックはすべて既に記述されているからです。このアプリはとても古いです。

たとえば、私の既存の Customers クラスは顧客テーブルに対応していますが、その値を自動的にマップする方法はありません。

理想的には、データ コンテキストを使用して IQueryable の結果を取得できるようになりたいので、linq を使用してデータベースにクエリを実行し、変更を保存できますが、行がデータベースから出てきたら、いくつかのカスタム ロジックを実行する必要があります。作成されたクラスを取得します。

では、SQL 値をプロパティ (つまり、既存の .Load() および .Save() メソッド) にマップするカスタム ロジックを必要とする既存のモデルおよび既存の poco クラスで EF4 をできるだけ簡単に使用するにはどうすればよいでしょうか?

4

1 に答える 1

1

すべてのエンティティクラスにInitializeメソッドがあると仮定すると、EFがエンティティをマテリアライズするときにプロパティをロードできます。

 public class YourContext : DbContext
 {
    protected ObjectContext ObjectContext
    {
        get
        {
            return ((IObjectContextAdapter)this).ObjectContext;
        }
    }

    public YourContext(string connectionString):base(connectionString)
    {
        ObjectContext.ObjectMaterialized += ObjectMaterialized;
    }

    void ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
    {
        dynamic entity = e.Entity;
        entity.Initialize();
    }
 }
于 2013-01-14T04:19:15.523 に答える