我有这样的数据模型:
第
*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上的获取对象不正确。
答案 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重复查询时,它可能会返回错误的结果。