【问题标题】:Entity Framework: LINQ Include() does not work after DB update, why?实体框架:LINQ Include() 在数据库更新后不起作用,为什么?
【发布时间】:2025-12-19 07:05:12
【问题描述】:

我是 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 对象之间没有看到任何不同,因为它们没有更改并且导航属性在那里。

有人见过吗?

谢谢

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

    • 除了可读性之外,您的查询与发帖者相比有什么优势?
    • 我认为这种方式有相同的结果: from acct in _entities.Account.Include("Item").Include("Item.ItemDetails") where acct.Id == accountId && m.ItemNumber .EndsWith(itemNumber) 选择账户;
    • 我想测试一下....记住 Include 和 Join 有一个奇怪的行为:)
    【解决方案2】:

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

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

    2. Item set 和 Account set 之间没有关系,因此,您必须像之前那样在 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

    案例 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;
    

    【讨论】: