实体框架未正确加载子实体

时间:2017-06-24 12:11:37

标签: c# sql-server entity-framework

我有这样的数据模型:

     *Id     | int
    ...      |

活动

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

在上面,星号(*)列是主键,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上的获取对象不正确。

3 个答案:

答案 0 :(得分:1)

查询B必须更改为

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

答案 1 :(得分:0)

使用&#34检查您的.edmx文件;打开" =>"自动编辑器选择器"确保所有Key列(在您的情况下:ArticleId,ActivityType,AccountId)存在于相关实体的密钥部分中。通过这种方式,您可以确定您的模型没有问题,然后我们可以深入了解您的问题。

答案 2 :(得分:0)

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