1

Je suis en train de mettre à niveau Entity Framework et j'ai mis à jour avec succès depuis v5 (mais depuis que nous sommes sur .NET 4.0, l'assemblage dit v4.4) vers la dernière version de v6. Nous avons rencontré un problème où EF5 et EF6 génèrent le même IQueryable de différentes manières qui ont des résultats différents.La requête générée est différente entre les versions d'Entity Framework

La requête LINQ est: Context.MyTable.SingleOrDefault(x => x.StringProperty != "");

Dans EF5, SQL ressemble à ceci (un peu simplifié):

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE N'' <> StringProperty

Et EF6, SQL ressemble à:

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE NOT((N'' = StringProperty) AND (StringProperty IS NOT NULL))

Si StringProperty est null, e La requête EF5 ne renvoie pas la ligne, contrairement à la version EF6. Je n'ai pas vu cela documenté nulle part (pas tout à fait sûr où regarder). Cet exemple est trivial à corriger, mais difficile à trouver. Existe-t-il un moyen d'activer le comportement hérité? Plus important encore, j'aimerais savoir s'il y a d'autres changements comme celui-ci où la requête est générée d'une manière différente qui aboutirait à des résultats de requête différents. Y a-t-il une liste de changements de rupture dans EF6?

Répondre

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

ce poste, NULL value handling in Entity Framework, devrait être utile.

« DbContext.ContextOptions.UseCSharpNullComparisonBehavior commutateur, qui sera automatiquement intégré la logique de comparaison NULL dans votre Entity Framework requêtes lorsque les valeurs sont nullable »

« Dans EF5, les paramètres par défaut de drapeau UseCSharpNullComparisonBehavior à false. EF6.0 introduit un changement de rupture où le flag par défaut à true "

+0

Je ne l'ai pas encore essayé, mais il semble être exactement ce dont j'ai besoin. À partir du lien que vous avez publié, il apparaît que EF6 par défaut true est la valeur recommandée pour des raisons de performances liées aux plans de requête SQL choisissant de ne pas utiliser d'index en raison de la manière dont le comportement hérité a généré les requêtes. Cela peut être utile aux futurs lecteurs. – kmc059000

+0

Nous utilisons d'abord le code, et sémantiquement le même mais inversé. '' DbContext.Configuration.UseDatabaseNullSematics = true'' est équivalent à '' UseCSharpNullComparisonBehavior = false'' – kmc059000