2010-12-06 34 views
2

Ich implementierte Vererbung mit einem Diskriminator-Feld, so dass alle meine Datensätze in derselben Tabelle sind. Mein Basistyp ist Person (auch der Name der Tabelle) und Fahrer und Passagier erben von ihm. Ich erhalte Instanzen des richtigen Typs (Fahrer und Beifahrer), wenn ich eine Abfrage für den Objektkontext zu Person ausführen. Beispiel:EF4-Vererbung und gespeicherte Prozeduren

var q = from d in ctx.Person 
     select d; 

Aber ich schaffe auch eine Funktion, die die Ausgabe der Funktion der Art Person, die eine gespeicherte Prozedur und kartiert aufruft. Aber jetzt bekomme ich eine Liste von Personen und nicht von Fahrern oder Fahrgästen, wenn ich diese Methode ausführe.

Jeder eine Idee, wie das zu lösen ist oder ist das ein Fehler in EF4?

Antwort

1

AFAIK, Sie können keine Diskriminatorzuordnung (z. B. TPH) verwenden, wenn Sie mit gespeicherten Prozedurenabbildungen arbeiten.

Die gespeicherte Prozedur muss einem komplexen Typ oder einer benutzerdefinierten Entität (z. B. POCO) zugeordnet werden, die Zuordnung kann nicht konditional sein.

Was Sie tun könnten, ist es zu einem regulären POCO zuzuordnen, aber dann Projekt das Ergebnis in den relevanten abgeleiteten Typ (manuelle Diskriminierung) gesetzt.

Z. B:

public ICollection<Person> GetPeople() 
{ 
    var results = ExecuteFunction<Person>(); // result is ObjectResult<Person> 
    ICollection<Person> people = new List<Person>(); 

    foreach (var result in results) 
    { 
     if (result.FieldWhichIsYourDiscriminator == discriminatorForDriver) 
     { 
     people.Add((Driver)result); 
     } 

     // other discriminators 
    } 

} 

Wenn Sie immer eine Sammlung von einer Art erwartet (z nur Treiber), dann würden Sie die foreach-Schleife nicht benötigen, können Sie nur den Bereich hinzufügen. Das oben genannte ist für den Fall, dass Sie eine gemischte Tüte verschiedener Menschenarten erwarten.

Würde mich interessieren, andere Antworten zu sehen, und wenn es einen besseren Weg gibt - aber das obige sollte funktionieren.

+0

Das Problem ist, dass mein Diskriminatorfeld nicht auf dem Objekt verfügbar ist und ich möchte es so behalten, weil wir diese Eigenschaft den Entwicklern, die unsere Bibliothek verwenden, nicht zugänglich machen wollen. Also ich fürchte, ich brauche eine native Lösung :-( –

+1

Ah so der Diskriminator ist nicht auf Ihrem Modell. Richtig - das ist normal, wie mit TPH. Sie müssen möglicherweise separate gespeicherte Prozeduren erstellen, und zuordnen Sie jeweils zu jedem B. 'usp_GetDrivers' (Karten zur Sammlung von Treibern),' usp_GetPassengers' (Karten zur Sammlung von Passagieren) Sie könnten eine einzige Methode in Ihrem Objektkontext haben, aber rufen Sie die andere Prozedur auf, je nachdem, was Sie versuchen Abrufen, würde das funktionieren? – RPM1984

Verwandte Themen