4

我是 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 文件。更改后,上述查询仍返回帐户和关联的项目,但不再包含 ItemDetails。

我已经验证了查询返回的 SQL,并且似乎没有任何问题,因为正在返回正确的数据。

此外,我在 edmx 文件中的 Item 和 ItemDetails 对象之间没有看到任何不同,因为它们没有更改并且导航属性在那里。

有没有人见过这个?

谢谢

4

2 回答 2

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;
于 2010-01-25T17:00:34.300 回答
1

您有两种可能的情况之一:

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

  2. Itemset 和set之间没有关系Account,因此,您必须像您所做的那样在 LINQ 中指定一个联接。

案例 1:如果是这种情况,那么您不需要 join 语句...通过选择Acount.Item自然会为您提供所有Item.AccountID等于的项目Account.ID

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

Account情况 2:如果和之间没有关系Item,那么.Include()绝对不会起作用,因为导航属性在您的模型中不存在。

Account结论:检查您的新模型以查看和之间是否存在关系Item。如果是,则删除加入。如果没有关系,那么你做错了什么。

这是一个假设场景 1 的 select 语句,Account.Item它不是一个集合:

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber)
              select acct;
于 2010-02-28T09:59:54.830 回答