实体框架

时间:2016-08-24 19:24:42

标签: c# entity-framework entity-framework-4 entity-framework-6

我正在升级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中的重大变化列表?

1 个答案:

答案 0 :(得分:2)

> Is there a way to turn on the legacy behavior?

这篇文章PHP demo应该有所帮助。

DbContext.ContextOptions.UseCSharpNullComparisonBehavior切换,当值可以为空时,它会自动将NULL比较逻辑嵌入到您的实体框架查询中”

“在EF5中,UseCSharpNullComparisonBehavior标志默认为false.EF6.0引入了一个重大更改,其中标志默认为true”