我正在将现有项目之一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时,它应该从数据库中填充用户实体?
答案 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.
}