背景是我所在的团队刚刚开始使用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个链接表中提取数据?
Q.2)使用一个edmx文件来对整个数据库进行建模是“正确的”吗?(对我来说听起来不太靠谱)。
发布于 2011-03-15 12:02:34
为模型将Lazy Load配置为true。只有在导航时才能加载关系。您还可以拆分模型,以避免太多不必要的关系。
发布于 2011-03-15 16:29:02
Linq-to-Entities查询不会自动获取任何内容。导航属性的获取是通过急切或延迟加载来实现的。您没有使用预加载,因为这需要在查询中调用Include (或单独调用ctx.LoadProperty )。因此,如果您的数据被获取,这一定是由于默认情况下启用的延迟加载。一旦您访问代码中的导航属性,就会触发延迟加载。
您还可以使用projections仅返回所需的数据。下面这样的代码应该返回只读数据:
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。
https://stackoverflow.com/questions/5307318
复制相似问题