nom de colonne du framework d'entité vers le mappage de propriété dbentry

c# entity-framework entity-framework-core

Question

J'essaie de mapper les propriétés des entités aux noms des colonnes de la base de données lors de l'enregistrement des entités dans DbContext, mais je ne vois pas comment le faire dans EF7.

Après avoir généré le schéma de base de données avec les migrations, les noms de colonnes ne sont pas toujours identiques aux noms de propriétés dans l'objet. Par exemple, sous le schéma d'objet:

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

    public string Name { get; set; }

    public User Author { get; set; }
}

aurait des colonnes Id , Name et AuthorId dans la base de données. Ensuite, lorsque je parcourt les propriétés EntityEntry, il contient les colonnes Id, Name et AthorId. Je peux facilement mapper Id et Nom.
Ce que je recherche, c'est comment savoir que "AuthorId" dans EntityEntry est mappé au champ Author dans Document?



Backround : J'implémente un mécanisme d'historique de version d'objet universel, qui obtiendrait les colonnes modifiées d'EntityEntries (de ChangeTracker dans SaveChanges () dans DbContext ) et enregistrerait les colonnes appropriées et les nouvelles valeurs. Ensuite, lors de la restauration d'objets, il devrait être en mesure de mapper ces modifications aux champs d'entité appropriés.

J'ai trouvé une question similaire pour EF6. Où Entity Framework stocke-t-il le mappage entre les noms de propriété et les colonnes qu'il sélectionne en SQL? mais il est assez compliqué et utilise des classes spécifiques à EF6.

Réponse populaire

Selon mon commentaire, le champ Author n'est pas un simple objet / structure (IE: DateTime , Enum , etc.) ni une primitive (IE: int , string , etc.). En tant que tel, il s’agit d’une Navigation Property et seul l’ID de l’objet est stocké. Cet ID vous permet ensuite de naviguer vers la ligne d'une autre table qui stocke les données complexes de l'objet Author .

En tant que tel, vous voudriez un DbContext et un DbSet tant que tels:

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

Cela produira des tableaux:

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

Lors de l'interrogation de la base de données:

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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi