如何在服务器端为MS Entity框架加载关联实体?

时间:2009-08-26 15:28:16

标签: entity-framework

假设我有几张表:

person(personid, name, email)
employee(personid,cardno, departmentID)   //personid,departmentID is foreign key
department(departmentID, departmentName)
employeePhone(personID, phoneID)   //this is relationship table
phone(phoneID, phonenumer) 

当EntityFramework为employee生成实体类时,此类具有以下成员:

public partial class employee{
  int _personid;
  string _cardno;
  string _departmentName;
  person _person;
  department _department;  
  //......
}

默认情况下,加载此类时,只有可用于employee表列的数据,而不是加载关联实体数据的数据。 如果我使用Linq在客户端获取数据,则应该使用Include进行linq查询。

我的问题是:当员工在服务器端实例化时,我想要在服务器端加载的关联实体数据。因此,当我在客户端获取实体时,所有可用数据都可以轻松地将其绑定到UI。

如何实施此请求?

2 个答案:

答案 0 :(得分:1)

不要将实体类型绑定到UI。这将UI耦合到实体层。加载将是您遇到的最少问题。使用耦合UI,您违反单一责任原则,要求维护黑名单/白名单以具有任何形式的安全性,不能处理循环引用的中断类型,因为您加载所有相关类型的所有字段而导致性能不佳等等等。

相反,创建一个专用的视图模型并投影到它上面:

var pm = (from e in Context.Employees
          where e.Id == id
          select new EmployeePresentation
          {
              EmployeeNumber = e.Number,
              Name = e.Person.Name,
              // etc.
          }.First();

因为这是LINQ to Entities,所以在Person等中引用的字段会自动加载,而不需要急切加载,延迟加载或显式Load()。 这些字段,而不是整个人,与其他所有方法一样。

根据评论更新 使用演示模型对于更新也很重要。我不希望用户能够更新他们可以看到的每个字段。同一实体的不同表示模型可能具有不同的验证/脚手架规则,因为它们在应用程序内的数据流中的不同点处使用。此外,用户应隐式更新他们看不到的字段(例如,时间戳)。

通常,我的更新看起来像这样(ASP.MVC Web应用程序):

public ActionResult Update(EmployeePresentation model)
{
    if (!ModelState.IsValid)
    {
        // User violated validation rule on presentation model.
        return View(model);
    }
    Repository.Update(model.Id, delegate(Employee employee) 
    {
        model.UpdateEmployee(employee);
    });
    return RedirectToAction("Index");
}

请注意,用户不可能以类型安全的方式更新他们不允许的内容,并且模型绑定,表示模型和存储库都可以扩展为自定义行为

答案 1 :(得分:0)

您希望的是延迟加载依赖实体。在下面的链接中有一篇文章讨论了这一点,在文章的底部,它还为您提供了如何在您仍然感到需要时执行延迟加载的说明。

请参阅本文中的“在Entity Framework中配置延迟加载”: Entity Framework and Lazy Loading