Sto cercando di associare le proprietà delle entità ai nomi delle colonne del database durante il salvataggio delle entità in DbContext, ma non riesco a capire come farlo in EF7.
Dopo aver generato lo schema del database con le migrazioni, i nomi delle colonne non sono sempre gli stessi dei nomi delle proprietà nell'oggetto. Ad esempio, sotto lo schema degli oggetti:
public class Document
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public User Author { get; set; }
}
avrebbe le colonne Id , Name e AuthorId nel database. Successivamente, quando eseguo un'iterazione su proprietà EntityEntry, contiene colonne Id, Name e AthorId. Posso facilmente mappare Id e Nome.
Cosa sto cercando è come capire che "AuthorId" in EntityEntry è mappato al campo Autore in Documento?
Backround : sto implementando il meccanismo di cronologia delle versioni degli oggetti universali, che otterrebbe le colonne modificate da EntityEntries (da ChangeTracker in SaveChanges () in DbContext ) e salverà le colonne appropriate e i nuovi valori. Successivamente, quando si ripristinano gli oggetti, dovrebbe essere in grado di mappare queste modifiche ai campi delle entità appropriate.
Ho trovato una domanda simile per EF6 Dove Entity Framework memorizza il mapping tra i nomi delle proprietà e le colonne che seleziona in SQL? ma è piuttosto complicato e utilizza classi specifiche per EF6.
Come per il mio commento, il campo Author
non è un semplice oggetto / struct (IE: DateTime
, Enum
, ecc.) Né un primitivo (IE: int
, string
, ecc.). In quanto tale, è una Navigation Property
e viene memorizzato solo l'ID dell'oggetto. Questo ID consente quindi di navigare verso la riga in un'altra tabella che memorizza i dati complessi dell'oggetto Author
.
Come tale, si vorrebbe un DbContext
e DbSet
come tali:
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; }
}
Questo produrrà tabelle:
Document: Id (int), Name (nvarchar), AuthorId (int) with FK to Author table
Author: Id (int), Name (nvarchar)
Quando si esegue una query sul 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