【发布时间】:2011-09-27 10:37:37
【问题描述】:
我正在将一些 POCO 类映射到具有多个查找表的现有数据库,我想知道最有效或最推荐的方法是什么。
假设有一个映射到 Employee 表的 Employee 模型类:
public class Employee
{
public int ID { get; set }
public string Name { get; set }
[ForeignKey("Role")]
public int RoleID { get; set }
public virtual EmployeeRole Role { get; set }
}
EmployeeRole 类/表看起来像:
public class EmployeeRole
{
public int ID { get; set } // For instance: 1
public string Description { get; set } // for instance: Manager
}
我知道我不需要显式声明外键 RoleID,但实际上我必须执行相当多的查询,这些查询依赖于具有“Manager”EmployeeRole 的 Employee。
现在的问题是,在结合效率、代码可读性和“数据独立性”方面,哪个更好?
假设 employees 是刚刚从存储库中提取的 IQueryable:
employees.Where(e => e.RoleID == 1);employees.Where(e => e.EmployeeRole.ID == 1);employees.Where(e => e.EmployeeRole.Description == "Manager");
2 和 3 的缺点是必须延迟加载导航属性,但 1 的缺点是 RoleID == 1 相当无意义并且绑定到数据库的当前状态。
我应该如何进行?有选项4吗?
【问题讨论】:
-
对您的句子“2 和 3 的缺点是必须延迟加载导航属性”只有一个注释。我不认为
EmployeeRole导航。属性被延迟加载。您不会在查询中访问Employee对象的具体实例,但您只是在表述一个Expression,稍后将其翻译成 SQL。不涉及延迟加载。拥有外键属性对于读取操作并不那么有趣(使用 nav.prop. 的 ID 也是如此,正如下面的答案所证明的那样),它对于更新/插入更重要。 1和2其实是一样的。 -
@Slauma - 你是对的,谢谢。我实际上意识到,当 J. Tihon 在他的答案上发布 Trace 结果时。再次感谢!
标签: c# query-optimization entity-framework-4.1