我是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,因为这些没有改变,导航属性就在那里。
有没有人见过这个?
由于
答案 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)
您有以下两种情况之一:
Item
与Account
有关系(在您的实体模型中表示为EntityAssociation,在DB中表示为外键):
Item
set和Account
set之间没有任何关系,因此,您必须像在LINQ中一样指定连接。
案例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:如果Account
和Item
之间没有任何关系,那么.Include()
肯定不会起作用,因为您的模型中不存在导航属性。
结论:检查新模型,看看Account
和Item
之间是否存在关系。如果是,则删除加入。如果没有关系,那你就做错了。
这是一个假设场景1并且Account.Item
不是集合的选择语句:
var account = from acct in _entities.Account.Include("Item.ItemDetails")
where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber)
select acct;