2015-12-24 7 views
8

Wenn ich zusätzliche Eigenschaften zu einer automatisch generierten EF-Klasse hinzufügen, indem eine zusätzliche partielle Klasse verwendet, werden diese Eigenschaften nicht ausgefüllt oder gefüllt, wenn Abfragen für die Datenbank ausgeführt werden.Zusätzliche Eigenschaften von Entity Framework werden nicht von DbContext.Database.SqlQuery

Beispiel:

automatisch generierten Klasse Person:

public partial class Person 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Meine eigene partielle Klasse

public partial class Person 
{ 
    public string DisplayName{ get; set; } 
} 

Wenn ich die folgende Abfrage machen:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 

und Verwendung

Die ID, FirstName und LastName sind ausgefüllt, aber nicht der DisplayName.

Allerdings, wenn ich eine ganz neue Klasse namens MyPerson

public partial class MyPerson 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName{ get; set; } 
} 

Und die gleiche Abfrage mit der Art der MyPerson laufen die DisplayName- auch bevölkert ist.

Kann mir jemand erklären oder mir sagen, wie ich dieses Problem beheben kann, damit ich Partials verwenden kann, anstatt neue Klassen/Typen erstellen zu müssen.

herunterladen ein Beispiel: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

UPDATE 2015.12.28: Während durch andere Stackoverflow und Codeproject-Foren zu lesen fand ich eine andere Möglichkeiten, um es an die Arbeit zu machen:

1) Unter Verwendung von Typebuilder (http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery), aber aufgrund aller Projektabhängigkeiten hatte ich Probleme, bereits erstellte Typen zu finden und den Speicher nicht zu sprengen;

2) Beste Option bisher: Vererbung verwenden.

Wenn ich eine andere Klasse mit nur diese Zeilen zu erstellen:

class Person_Reflect : Person { } 

ich den folgenden Code verwenden können (es wird die Zuordnung in der EDMX-Datei und die Nutzung Reflexion ignorieren:

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
+3

Sind Sie sicher, dass die 2. Teilklasse von 'Person' im richtigen Namensraum ist? –

+0

Und keine Ausnahme, seit Sie das Modell geändert haben? – dotctor

+0

Seht ihr DisplayName als eine Eigenschaft ohne Wert? –

Antwort

0

try entfernen der *

@" 
SELECT 
    Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
FROM [Person]" 

Alternativ könnten Sie dies tun, ist Code ... und dann würden Sie nicht müssen sie in Ihre RAW-SQL enthalten

public string DisplayName { get { return FirstName+ " " +LastName ; } } 
+0

Das * auslassen funktioniert nicht, es macht es sogar noch schlimmer; Wenn ich eine Spalte vergesse, endet die Anwendung mit der Ausnahme: Der Datenleser ist mit dem angegebenen 'Application.Person' nicht kompatibel. Ein Mitglied des Typs 'COLUMNNAME' hat keine entsprechende Spalte im Datenleser mit demselben Namen. Sie haben absolut Recht, Ihre Codelösung löst dieses Beispiel, aber ich habe eine dynamische Abfrage, die zur Laufzeit angereichert werden kann, um eine Vielzahl von Endbenutzeroptionen für die Anzeige/Formatierung von Ergebnissen zu erstellen. Ich habe also nur eine Ansicht Optionen: Evals verwenden oder dynamische Abfragen erstellen. –

+0

sollte es funktionieren ... die Spalte muss der gleiche CASE und Datentyp sein. Ich habe etwas ähnliches selbst gemacht, also weiß ich, dass es funktioniert .. überprüfen Sie bitte Fall und Arten bitte – Seabizkit

+0

Lieber Seabizkit. Ich habe ein Testbeispiel hochgeladen, in dem ich nicht zu dem Ergebnis kommen kann, was Sie erreicht haben. Der Link zum vollständigen Beispiel ist: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0 –

1

beste Option bisher ohne viel zu kodieren und mit oder viel Code-Review zu tun, wenn Datenbankänderungen Vererbung verwenden auftritt.

Wenn ich eine andere Klasse mit nur diese Zeile erstellen:

class Person_Reflect : Person { } 

ich den folgenden Code verwenden können (es wird die Zuordnung in der EDMX-Datei und die Nutzung Reflexion ignorieren):

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
Verwandte Themen