2016-07-28 27 views
0

Ich versuche, mit einer vorhandenen Datenbank zu arbeiten, und meine Fähigkeit, Änderungen vorzunehmen, sind schwierig. Ich hoffe, einige Übergangsarbeit zu machen und ein ORM zu sein, aber ich habe ein Problem getroffen.Entity Framework Relation mit null oder 0 Key

Ich benutze EF Fluent API (näher an der NHibernate Art und Weise Dinge zu tun) und wir haben eine Nullable Spalte ParentId in der Datenbank. Ich habe eine HasOptional Beziehung für diesen erstellt und es funktioniert:

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

Diese besondere Spalte scheint in dieser Spalte eine Menge 0en zu haben (sie verwenden Fremdschlüssel nicht) und ich kann nicht in der Lage sein, ein hinzufügen FK Constraint als das meine anderen Anwendungen brechen (da müsste ich gehen und alles ändern/löschen, das keine FK-Übereinstimmung hat). EF behandelt dies gut genug und für diese Datensätze, die kein passendes Elternteil für ID 0 haben, erhält EF null. Dies ist jedoch umfällt, wenn ich versuche, eine Linq Abfrage wie folgt zu verwenden:

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

alles auszuwählen, in dem Parent != null. Dies führt diese Art von SQL-Abfrage

WHERE ParentId = null 

Das ist natürlich nicht die gewünschten Ergebnisse erhalten, wie es die Datensätze zurückgibt, die eine ParentId von 0 haben. Wenn ich das Objekt wie erwartet auf der Grundlage dieser SQL-Abfrage inspiziere, erhalte ich Ergebnisse, die beide korrekt übergeordnete Elemente haben, und viele, die parent als null haben.

Gibt es eine Möglichkeit, EF zu erhalten, diese Spalte in ihren Abfragen in etwas wie NULLIF(0) zu übersetzen? Wenn nicht, brauche ich ein paar Ideen, wie ich das umgehen kann, damit ich EF benutzen kann, ohne dass es zu brechenden Änderungen in der Datenbank kommt.

Ich habe bereits eine berechnete Spalte berücksichtigt, aber das würde mir nur bei der Abfrage helfen. Es wird umfallen, wenn ich jemals versuche, das Wesen zu bestehen.

Antwort

0

Eine Abhilfe ich nur realisiert haben, ist von meiner Anfrage zu so etwas wie dies ändern:

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

Das drum herum ist, aber es ist meine Anfragen benötigen, um bedeutet immer zu berücksichtigen, dieses Problem mit der Datenbank, wo ich hoffte, dass all dies durch das Mapping nahtlos gehandhabt werden konnte. Ich hoffe immer noch auf eine bessere Antwort als diese.