如何在加载后使用POCO和DbContext在Entity Framework中初始化对象?

时间:2012-09-03 09:50:54

标签: c# entity-framework poco dbcontext entity-framework-5

我正在使用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);

除了循环收集集合中的所有对象并手动设置属性之外,实现此目的的可能方法是什么?

1 个答案:

答案 0 :(得分: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事件。