2016-07-28 3 views
0

J'essaie de travailler avec une base de données existante et ma capacité à effectuer des modifications est difficile. J'espère faire un peu de travail de transition et être un ORM cependant, j'ai rencontré un problème. J'utilise EF Fluent API (plus proche de la manière de faire de NHibernate) et nous avons une colonne nullable ParentId dans la base de données. J'ai créé un pour cela et il fonctionne relation HasOptional:Entity Framework Relation avec null ou 0

HasOptional(x => x.Parent).WithMany().Map(m => m.MapKey("ParentId")); 

Cette colonne particulière semble avoir beaucoup de 0 dans cette colonne (ne pas utiliser les clés étrangères) et je ne peux pas être en mesure d'ajouter un Contrainte FK comme ça que je casse leurs autres applications (car je devrais aller quand même et modifier/supprimer tout ce qui n'a pas de correspondance FK). EF gère cela assez bien et pour ces enregistrements qui n'ont pas de parent correspondant pour l'id 0, EF est nul. Cela tombe cependant sur si je tente d'utiliser une requête Linq comme ceci:

myitems.Where(i => Parent != null) 

pour sélectionner tout où Parent != null. Cela se traduit par ce type de requête SQL

WHERE ParentId = null 

Bien sûr, ne pas obtenir les résultats escomptés car il renvoie les enregistrements qui ont une ParentId de 0. Lorsque j'inspecte l'objet, comme attendu sur la base de cette requête SQL, j'obtiens des résultats qui ont tous les deux un parent correctement et plusieurs qui ont un parent comme nul.

Existe-t-il un moyen d'obtenir EF pour traduire cette colonne dans ses requêtes à quelque chose comme NULLIF(0)? Si ce n'est pas le cas, j'ai besoin d'idées sur la façon dont je peux contourner ce problème afin que je puisse utiliser EF sans avoir à provoquer de changements importants dans la base de données.

J'ai déjà considéré une colonne calculée, mais cela ne m'aiderait que sur l'interrogation. Il tombera si jamais j'essaye de persister l'entité.

Répondre

0

Une solution que je viens de réaliser est en modifiant ma requête à quelque chose comme ceci:

myitems.Where(i => i.Parent != null && i.Parent.Id != 0) 

Cela ne la contourner, mais cela ne signifie mes requêtes auront toujours besoin de prendre en compte cette question avec la base de données, où j'espérais que tout cela pourrait être géré de façon transparente par la cartographie. Espérant toujours une meilleure réponse que celle-ci.