2

EF5を使用しています。DbContext に含まれる DbSet コレクションのすべてのオブジェクトを初期化したいと思います。オブジェクト フィールド (必ずしも他の POCO との関係である必要はありません) が初期化された後、できれば (必ずしもそうとは限りません)。これは、「建設後のインターセプト」または「ロード後のインターセプト」と短縮される場合があります。

初期化では、DbContext インスタンス (現在のユーザー設定など) と並行して存在するオブジェクトのインスタンスを使用して、オブジェクトのいくつかのプロパティを設定する必要があります。

だから基本的に:

var settings = new Settings();
settings.PrintName = false;

var context = new MyDbContext();
// here initialize context so that every User object get initialized with settings
var john = context.Users.Where(x => x.Name == "John").FirstOrDefault();
Assert.AreEqual(john.Settings, settings);

コレクション内のすべてのオブジェクトをループして手動でプロパティを設定する以外に、これを達成するための可能なアプローチは何ですか?

4

1 に答える 1

5

ObjectMaterializedで公開されているイベントを使用できますObjectContext

var settings = new Settings();
settings.PrintName = false;

var dbContext = new MyDbContext();
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += (sender, e) => {
    var user = e.Entity as User;
    if (e != null) {
       // Now you can call your initialization logic
       user.Settings = settings;
    }
};

var john = dbContext.Users.Where(x => x.Name == "John").FirstOrDefault();
Assert.AreEqual(john.Settings, settings);

ObjectMaterializedイベントは、データベース レコードから共通 (スカラーおよび複合) プロパティを設定した後、ナビゲーション プロパティを設定する前に発生させる必要があります。

于 2012-09-03T10:12:43.357 に答える