实体框架:DBQ更新后LINQ Include()不起作用,为什么?

时间:2010-01-22 18:29:56

标签: asp.net-mvc entity-framework linq-to-entities edmx

我是Entity Framework和LINQ的新手,并且遇到了一个相当奇怪的场景。

我一直在使用以下查询来返回帐户信息:

var account = ((from acct in _entities.Account
                        join m in _entities.Item on acct.Id equals m.Account.Id
                        where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
                        select acct) as ObjectQuery<Account>).Include("Item.ItemDetails");

我们最近对数据库进行了一些更改并生成了一个新的edmx文件。在更改之后,上面的查询仍然返回帐户和关联的Item,但不再包含ItemDetails。

我已经验证了查询返回的SQL,并且由于正在返回正确的数据,似乎没有任何错误。

此外,我没有在Item和ItemDetails对象之间的edmx文件中看到不同的anthing,因为这些没有改变,导航属性就在那里。

有没有人见过这个?

由于

2 个答案:

答案 0 :(得分:1)

在Include(...)中使用了导航属性的名称,因此最好从.edmx中检查属性的确切名称(特别是如果它是单数或复数)。

您也可以尝试更改此查询:

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              join m in _entities.Item 
                  on acct.Id equals m.Account.Id
              where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
              select acct;

答案 1 :(得分:1)

您有以下两种情况之一:

  1. ItemAccount有关系(在您的实体模型中表示为EntityAssociation,在DB中表示为外键):

  2. Item set和Account set之间没有任何关系,因此,您必须像在LINQ中一样指定连接。

  3. 案例1:如果是这种情况,那么您不需要加入声明......选择Acount.Item自然会为您提供Item.AccountID等于Account.ID的所有项目}

    所以你的加入声明:join m in _entities.Item on acct.Id equals m.Account.Id 基本上告诉Item回到Account以检查ID。如果它们尚未连接,则您无法获得m.Account.ID

    案例2:如果AccountItem之间没有任何关系,那么.Include()肯定不会起作用,因为您的模型中不存在导航属性。

    结论:检查新模型,看看AccountItem之间是否存在关系。如果是,则删除加入。如果没有关系,那你就做错了。

    这是一个假设场景1并且Account.Item不是集合的选择语句:

    var account = from acct in _entities.Account.Include("Item.ItemDetails")
                  where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber)
                  select acct;