Ich habe gerade mit EntityFramework 6 begonnen und probiere noch einige Szenarien aus. Ich habe die OnModelCreating () - Methode in meiner Context-Klasse überschrieben und habe einige Logik bezüglich der Zuordnung von Spaltennamen zu Eigenschaften wie:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
modelBuilder.Entity<Ninja>().Property(x => x.DateOfBirth).HasColumnName("date_of_birth");
}
Wie Sie sehen, lautet der Eigenschaftsname DateOfBirth und die entsprechende Spalte in der Datenbank ist date_of_birth. Wenn ich nun neue Daten in die Datenbank einfüge / füge, funktioniert dieses Mapping einwandfrei. Und wenn ich Daten wie folgt abfragen / abrufen:
var ninja = context.Ninjas.FirstOrDefault(n => n.Name.StartsWith("Kacy"));
Es funktioniert gut.
Wenn ich jedoch eine DB-Funktion (postgre 10) verwenden möchte, um die Daten abzurufen:
private static void RetrieveDataWithStoredProc()
{
using (var context = new NinjaContext())
{
context.Database.Log = Console.WriteLine;
var ninjas = context.Ninjas.SqlQuery("select * from get_old_ninjas()").ToList();
}
}
Ich bekomme die folgende Ausnahme:
The data reader is incompatible with the specified 'NinjaDomain.DataModel.Ninja'.
A member of the type, 'DateOfBirth', does not have a corresponding column in the data reader with the same name.
Dies bedeutet, dass die Logik im Modellbuilder bezüglich des Spaltennamens der DateOfBirth-Eigenschaft nicht berücksichtigt wird. Wenn ich nach dem SqlQuery eine explizite Zuordnungslogik hinzufüge, funktioniert es ...
Meine Frage ist, warum diese Methode die in der OnModelCreating
Methode bereits vorhandene Logik nicht OnModelCreating
, wie dies in allen anderen Fällen der Fall ist.
Warum berücksichtigt diese Methode nicht die Logik, die bereits in der OnModelCreating-Methode vorhanden ist, wie in allen anderen Fällen?
Das ist eine Einschränkung in EF6. EF Core respektiert Ihre Spaltenzuordnungen, wenn Sie aus unformatierten SQL-Abfragen laden:
Die Spaltennamen in der Ergebnismenge müssen mit den Spaltennamen übereinstimmen, denen die Eigenschaften zugeordnet sind. Beachten Sie, dass sich dies von EF6 unterscheidet, bei dem die Zuordnung von Eigenschaften / Spalten für unbearbeitete SQL-Abfragen ignoriert wurde und die Spaltennamen der Ergebnismengen mit den Eigenschaftennamen übereinstimmen mussten.