Я занимаюсь модернизацией Entity Framework и успешно обновлен с версии 5 (но поскольку мы на .NET 4.0, сборка фактически говорит v4.4) до последней версии v6. Мы столкнулись с проблемой, когда EF5 и EF6 генерируют один и тот же IQueryable разными способами, которые имеют разные результаты.Сгенерированный запрос отличается от версий Entity Framework
Запрос 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
является null, th e EF5 запрос не возвращает строку, а версия EF6. Я не видел этого документально нигде (не совсем уверен, где искать). Этот пример тривиально исправить, хотя его трудно найти. Есть ли способ включить наследие?
Что еще более важно, я хотел бы знать, есть ли какие-либо другие изменения, подобные этому, когда запрос создается другим способом, который приведет к различным результатам запроса. Есть ли список изменений в EF6?
Я еще не пробовал, но, похоже, это именно то, что мне нужно. Из опубликованной вами ссылки видно, что значение EF6 по умолчанию - это рекомендуемое значение из-за причин производительности, связанных с планами SQL-запросов, которые предпочитают не использовать индексы из-за того, как поведение по умолчанию создавало запросы. Это может быть примечательным для будущих читателей. – kmc059000
Сначала мы используем код и семантически то же, но наоборот. '' DbContext.Configuration.UseDatabaseNullSematics = true'' эквивалентно '' UseCSharpNullComparisonBehavior = false'' – kmc059000