2015-07-09 41 views
1

这工作:奇怪的行为在实体INCLUDE框架

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.Include(s=>s.Addresses).FirstOrDefault<Person>(e => e.EntityId == id); 
} 

虽然这并不:

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.FirstOrDefault<Person>(e => e.EntityId == id); 
} 

我想包括地址,文件基于布尔标志从功能到来。但是,似乎EF在使用IF条件时不包括它们。

这与我的previous问题有关,它使用Include实际工作。

+0

**经验法则:**如果非要说“编辑”把在编辑,那么你并不真正需要编辑。 –

回答

2

您需要的Include结果分配回query

query = query.Include(p => p.Addresses); 
0

实体框架的'Include'函数只有在连接到查找实体的整个linq查询时才可用。这是因为linq查询实际上是一种Expression的形式,可以在执行之前作为一个整体进行检查。

在第二个例子中,Person对象已经从数据库中分离出来,因此EF没有关于哪个表Person来自哪个表以及如何将Person与地址表连接起来以获得所需结果的信息。

如果启用动态代理生成功能,EF能够跟踪实体和数据库之间的关系。但是,我不确定这是否会使包含声明起作用。

+0

我不相信你的发言。当你说Person对象已经从数据库中分离出来时,你是什么意思?它是一个IQueryable对象,'query'变量持有正在修改的查询。 –