web-dev-qa-db-fra.com

Comment spécifier le mappage de table de base Entity Framework?

J'ai fait un simple Entity Framework ASP Core Application qui fonctionne mais je ne sais pas pourquoi:

J'ai créé un contexte comme celui-ci:

public class AstootContext : DbContext
{
    public AstootContext(DbContextOptions<AstootContext> options)
        : base(options)
    { }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<User> Users { get; set; }
}

Et j'ai deux tables avec des modèles comme celui-ci:

public class Account
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public DateTime Created { get; set; }

    List<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public DateTime Birthday { get; set; }
    public Account Account { get; set; }
}

Ce qui est intéressant, c'est que lorsque j'exécute mon application, elle peut effectivement récupérer les données. Cela semble juste bizarre car je n'ai spécifié aucun mappage de table. Je suppose que cela n'est que des cartes automatiques, car les tables spécifiées sont du même nom.

Mes questions sont:

  1. Comment spécifier le mappage de table explicite de table au cas où je ne voudrais pas que mes noms de modèle soient exactement les mêmes que la base de données?

  2. Comment spécifier le mappage de colonnes personnalisé.

  3. Y a-t-il quelque chose de spécial que je dois spécifier pour les clés primaires/étrangères

modifier

Clarifier

  1. disons que j'avais une table dans la DB MyAccounts et que je voulais la mapper à une entité Accounts.

  2. Disons que j'avais un mot de passe de colonne et que je voulais le mapper à une propriété POCO PasswordHash

14
johnny 5
  1. Pour spécifier le nom de la table de base de données, vous pouvez utiliser un attribut ou l'API courante:

    Utilisation d'attributs:

    [Table("MyAccountsTable")]
    public class Account
    {
         public string PasswordHash { get; set; }
    }
    

    Utilisation de l'API Fluent:

    public class YourContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Language>(entity => {
                entity.ToTable("MyAccountsTable");
            });
        }
    }
    
  2. Pour nommer vos colonnes manuellement, c'est très similaire et vous pouvez utiliser un attribut ou l'API fluide:

    Utilisation d'attributs:

    public class Account
    {
        [Column("MyPasswordHashColumn")]
        public string PasswordHash { get; set; }
    
    }
    

    Utilisation de l'API Fluent:

    public class YourContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Language>(x => x
                .ToTable("MyAccountsTable")
                .Property(entity => entity.PasswordHash)
                    .HasField("MyPasswordHashColumn")
            );
        }
    }
    
19
DavidG