1

我正在将现有项目之一 DAL 升级到实体框架。在旧版 DAL 中,我有类似的构造函数

public class User{
    public User(){}

   // This constructor loads data from database where UserID is found
   public User(int UserID){} 

}

那么如何在 EF 中实现这一点,即当我在参数化构造函数中传递 UserID 时,它应该从数据库中填充用户实体?

4

3 回答 3

1

当我在参数化构造函数中传递 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 肯定没有其中的任何东西。

于 2013-05-19T19:31:56.827 回答
0

使用 EF 中的存储库抽象模式进行研究。事实上,如果您有一个现有的 DAL,还请查看 EF 的逻辑工作单元抽象模式示例。你很可能需要它。

于 2013-05-19T14:36:57.857 回答
0

实体框架对象需要一个默认构造函数。

要解决这个问题,您可以挂钩ObjectMaterializedContext 的事件。

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.
}
于 2013-05-19T14:37:15.077 回答