Name des Entitätsrahmenspaltens für Eigenschaft mapping dbentry

c# entity-framework entity-framework-core

Frage

Ich versuche Entity-Eigenschaften zu Datenbankspaltennamen zuzuordnen, während Entitäten in DbContext gespeichert werden, aber ich kann nicht herausfinden, wie man es in EF7 macht.

Nach dem Generieren des Datenbankschemas mit Migrationen stimmen die Spaltennamen nicht immer mit den Objektnamen überein. Zum Beispiel unter dem Objektschema:

public class Document
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public User Author { get; set; }
}

würde Id , Name und AuthorId Spalten in der Datenbank haben. Wenn ich über EntityEntry-Eigenschaften iteriere, enthält es die Spalten ID, Name und AthorId. Ich kann ID und Name leicht zuordnen.
Was ich suche ist, wie man herausfinden kann, dass "AuthorId" in EntityEntry dem Feld "Author" im Dokument zugeordnet ist?



Backround : Ich implementiere universellen Objektversions-Historienmechanismus, der modifizierte Spalten von EntityEntries (von ChangeTracker in SaveChanges () in DbContext ) erhält und richtige Spalten und neue Werte speichert. Als nächstes sollte es beim Wiederherstellen von Objekten in der Lage sein, diese Änderungen den richtigen Entitätsfeldern zuzuordnen.

Ich habe eine ähnliche Frage für EF6 gefunden. Wo speichert Entity Framework die Zuordnung zwischen Eigenschaftsnamen und den Spalten, die es in SQL auswählt? aber es ist ziemlich kompliziert und verwendet Klassen, die für EF6 spezifisch sind.

Beliebte Antwort

DateTime meinem Kommentar ist das Author Feld kein einfaches Objekt / struct (IE: DateTime , Enum , etc) noch ein Primitiv (IE: int , string , etc). Als solches ist es eine Navigation Property und nur die ID des Objekts wird gespeichert. Mit dieser ID können Sie dann zu der Zeile in einer anderen Tabelle navigieren, in der die komplexen Daten des Author Objekts gespeichert sind.

Daher möchten Sie einen DbContext und DbSet s als solche:

public class Document {
    public int Id { get; set; } // No need for [Key] ID is auto detected
    public string Name { get; set; }

    // Foreign Keys
    public int AuthorId { get; set; } // Can use "int?" if you want to allow it to be nullable
    public User Author { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class BookContext : DbContext {
    public DbSet<Author> Authors { get; set; }
    public DbSet<Document> Documents { get; set; }
}

Dies wird Tabellen erzeugen:

Document: Id (int), Name (nvarchar), AuthorId (int) with FK to Author table
Author:   Id (int), Name (nvarchar)

Beim Abfragen der DB:

var books = BookContext.Documents // Access documents table
                 .Include(q => q.Author) // Ensure that the author's properties are loaded, not just the ID
                 .Where(q => q.Name.Contains("SomeText")) // Search for documents with a name matching this text


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum