我正在升级Entity Framework并且已成功从v5(但是因为我们在.NET 4.0上,程序集实际上是v4.4)升级到最新版本的v6。我们遇到了一个问题,EF5和EF6以不同的方式生成相同的IQueryable,结果不同。
LINQ查询是:
Context.MyTable.SingleOrDefault(x => x.StringProperty != "");
在EF5中,SQL看起来像这样(简化了一点):
SELECT TOP (2)
ID AS ID,
StringProperty AS StringProperty
FROM MyTable
WHERE N'' <> StringProperty
在EF6中,SQL看起来像:
SELECT TOP (2)
ID AS ID,
StringProperty AS StringProperty
FROM MyTable
WHERE NOT((N'' = StringProperty) AND (StringProperty IS NOT NULL))
如果StringProperty
为空,则EF5查询不返回该行,而EF6版本则返回该行。我没有在任何地方看到过这种情况(不完全确定在哪里看)。虽然很难找到,但这个例子很容易解决。有没有办法打开遗留行为?
更重要的是,我想知道是否存在任何其他类似的更改,其中生成查询的方式不同会导致查询结果不同。是否有EF6中的重大变化列表?
答案 0 :(得分:2)
> Is there a way to turn on the legacy behavior?
这篇文章PHP demo应该有所帮助。
“DbContext.ContextOptions.UseCSharpNullComparisonBehavior
切换,当值可以为空时,它会自动将NULL比较逻辑嵌入到您的实体框架查询中”
“在EF5中,UseCSharpNullComparisonBehavior标志默认为false.EF6.0引入了一个重大更改,其中标志默认为true”