C# 加载后如何使用POCO和DbContext初始化实体框架中的对象?

C# 加载后如何使用POCO和DbContext初始化实体框架中的对象?,c#,entity-framework,poco,dbcontext,entity-framework-5,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 i

我用的是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);

除了遍历集合中的所有对象并手动设置属性之外,实现这一点的可能方法是什么?

您可以使用
ObjectContext上公开的
ObjectMaterialized
事件:

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
事件应在从数据库记录填充公共(标量和复杂)属性之后,但在填充导航属性之前引发。

如果不需要在EF将值分配给POCO之后引发,为什么不在POCO类的构造函数中执行此操作?我需要将设置对象实例传递给构造函数。构造函数需要是:public User(Settings设置)-可以在DbContext中使用非默认构造函数吗?EF将始终使用默认构造函数。谢谢-精确的解决方案。为了完成回答,您知道是否有其他方法可以只处理特定类型的实体(来自DbSet的T),这样就不需要进行类型检查了吗?不,我不知道有任何这样的方法。