【问题标题】:Entity Framework not loading child entities correctly实体框架未正确加载子实体
【发布时间】:2017-06-24 12:11:36
【问题描述】:

我有一个这样的数据模型:

文章

     *Id     | int
    ...      |

活动

     *ArticleId    | int
     *ActivityType | nvarchar(50)
     *AccountId    | nvarchar(50)
     ...           |

在上面,star (*) 列是主键,ArticleId 是文章 id 的外键。

我首先使用 Entity Framework 6 数据库。当我在下面运行代码时,结果大部分时间都不相等!结果是可重复的。

查询 A:

var aCount1 = db.Article.Include("Activity")
                .First(x => x.Id == 1).Activity.Count;

查询 B:

var aCount2 = db.Activity.First(x => x.ArticleId == 1).Count();

我使用了延迟加载和急切加载,但没有任何改变。

实体框架查询:

查询 A:

    SELECT 
        [Extent1].[ActivityType] AS [ActivityType], 
        [Extent1].[AccountId] AS [AccountId], 
        [Extent1].[ArticleId] AS [ArticleId]
    FROM 
        [dbo].[Activity] AS [Extent1]
    WHERE 
        [Extent1].[ArticleId] = @EntityKeyValue1

查询 B:

    SELECT 
        [GroupBy1].[A1] AS [C1]
    FROM 
        (SELECT 
             COUNT(1) AS [A1]
         FROM 
             [dbo].[Activity] AS [Extent1]
         WHERE 
             ([Extent1].[ArticleId] = @p__linq__0))  AS [GroupBy1]

当我从 SSMS 执行上述查询时,结果相同,但在 EF 上获取的对象不正确。

【问题讨论】:

  • 对此问题进行简短、完整的复制。您可能会发现问题所在。如果没有,请在此处发布。
  • 我不清楚你正在经历什么行为,你期待什么,它们之间有什么区别。

标签: c# sql-server entity-framework


【解决方案1】:

查询 B 必须改为

Query B) var aCount2 = db.Activity.Where(x=>x.ArticleId == 1).Count();

【讨论】:

    【解决方案2】:

    使用“打开方式”=>“自动编辑器选择器”检查您的 .edmx 文件,以确保您的所有关键列(在您的情况下为:ArticleId、ActivityType、AccountId)都存在于相关实体的关键部分中。这样您就可以确定您的模型没有问题,然后我们可以深入了解您的问题。

    【讨论】:

      【解决方案3】:

      是的,由于技术限制,我有两个数据库。在本地数据库上,ArticleId 不是主键的一部分,但在主数据库上没问题。我认为 EF 使用主键进行一级缓存,所以当我在当前会话中使用不同的 ArticleId 重复查询时,它可能会返回错误的结果。

      【讨论】:

        猜你喜欢
        • 2016-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        相关资源
        最近更新 更多