我正在将现有项目之一 DAL 升级到实体框架。在旧版 DAL 中,我有类似的构造函数
public class User{
public User(){}
// This constructor loads data from database where UserID is found
public User(int UserID){}
}
那么如何在 EF 中实现这一点,即当我在参数化构造函数中传递 UserID 时,它应该从数据库中填充用户实体?
我正在将现有项目之一 DAL 升级到实体框架。在旧版 DAL 中,我有类似的构造函数
public class User{
public User(){}
// This constructor loads data from database where UserID is found
public User(int UserID){}
}
那么如何在 EF 中实现这一点,即当我在参数化构造函数中传递 UserID 时,它应该从数据库中填充用户实体?
当我在参数化构造函数中传递 UserID 时,它应该填充用户实体
看起来转向实体框架也需要范式转变。你习惯了Active Record或类似的东西。当您使用 EF 时,一个重要的概念是实体(即类,如User
)是持久性无知的。
上下文负责物化数据库中的实体对象,跟踪它们的变化并保存变化。实体本身并不参与其中。
因此,在您的情况下,您将不再获得User
通过
var user = new User(1);
但是通过
using(var context = new MyContext())
{
var user = context.Users.Find(1);
// in ObjectContext: context.Users.Single(u => u.UserId == 1)
}
这种方式看起来更复杂,但现在它User
是一个简单的 POCO(如果你先编写代码)。旧版 DAL 肯定没有其中的任何东西。
使用 EF 中的存储库抽象模式进行研究。事实上,如果您有一个现有的 DAL,还请查看 EF 的逻辑工作单元抽象模式示例。你很可能需要它。
实体框架对象需要一个默认构造函数。
要解决这个问题,您可以挂钩ObjectMaterialized
Context 的事件。
Context.BaseObjectContext.ObjectMaterialized += ObjectContext_OnObjectMaterialized;
private void ObjectContext_OnObjectMaterialized(
object sender,
ObjectMaterializedEventArgs e)
{
//e.Entity is the newly created object
//you can cast it and call into it to do any initilisation etc.
}