实体框架从参数化构造函数加载实体

时间:2013-05-19 14:30:53

标签: .net entity-framework entity-framework-5

我正在将现有项目之一DAL升级到Entity Framework。在Leag DAL中,我有像例如

这样的构造函数
public class User{
    public User(){}

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

}

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

3 个答案:

答案 0 :(得分: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必须拥有它内部的任何内容。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

要解决此问题,您可以挂钩上下文的ObjectMaterialized事件。

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.
}