nome colonna della struttura dell'entità alla proprietà mapping dbentry

c# entity-framework entity-framework-core

Domanda

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.

Risposta popolare

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:

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; }
}

Quando si esegue una query sul DB:

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; }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché