假设我有几张表:
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。
如何实施此请求?
答案 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