背景是我刚刚开始使用EntityFramework的团队;首先我们设计数据库,把所有的表关系放在适当的位置,外键等;然后通过visual studio添加一个新的ADO.NET实体数据模型,并自动神奇地获取生成的edmx文件代表整个数据库!
现在我专注于两个为所有下拉列表和查找列表提供数据的表格;
TLookupDomain (domainID, domainName, domainDesc )
TLookup (lookupID, domainID, lookupCode, lookupDisplay, lookupDesc, sortOrder)
关系是从左到右的1-M:
TLookupDomain - < TLookup - < TOther(+另外30个左右的其他表)
因此,lookupID是多达30个表的外键;
IQueryable<TLookup> qList = from l in ctx.TLookups
where l.domainID == 24
select l;
foreach (TLookup l in qList)
{
//do something.
System.Diagnostics.Debug.WriteLine("{0}\t{1}", l.lookupCode, l.lookupDisplay);
foreach (TOther f in l.TOthers)
{
System.Diagnostics.Debug.WriteLine("{0}\t{1}", f.feeAmount, f.feeDesc);
}
}
当我执行上面的LINQ时,我得到了TLookup表的所有字段(这是公平的),但是也为30个左右的链表提取了数据,即使我对其他表不感兴趣此时表格的数据,我将尽快丢弃所有数据,因为LINQ取出它。
我有两个问题: Q.1)我可以以某种方式修改上面的LINQ查询或告诉EntityFramework否则不要打扰来自其他30个链表的fetchin数据吗?
Q.2)拥有一个模拟整个数据库的edmx文件是“正确的”吗? (听起来很狡猾)。
答案 0 :(得分:1)
为模型配置Lazy Load为true。关系应该只在navegation上加载。您还可以拆分模型以避免太多不必要的关系。
答案 1 :(得分:1)
Linq-to-Entities查询不会自动获取任何内容。通过急切或延迟加载来获取导航属性。您没有使用预先加载,因为这需要在查询中调用Include
(或单独ctx.LoadProperty
)。因此,如果您的数据被提取,则必须归因于默认情况下启用的延迟加载。一旦访问代码中的导航属性,就会触发延迟加载。
您还可以使用投影返回所需的数据。像这样的东西应该返回只读数据:
var query = from l in ctx.TLookups
where l.domainId == 24
select new
{
l.lookupCode,
l.lookupDisplay,
l.TOthers
};
拥有一个或多个EDMX是常见的两难选择。使用单个EDMX可以使事情变得更简单。如果您想知道如何使用多个EDMX并共享概念定义,请查看以下两篇文章:Part 1,Part 2。