admin

如何指定实体框架核心表映射?

sql

我已经制作了一个简单的Entity Framework ASP Core Application,它可以工作,但是我不知道为什么:

我做了这样的上下文:

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

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

我有两个表,像这样的模型:

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

有趣的是,当我运行我的应用程序时,它实际上可以拾取数据。似乎很奇怪,因为我没有指定任何表映射。我假设这只是自动映射,因为指定的表具有相同的名称。

我的问题是:

  1. 如果我不希望模型名称与数据库完全相同,该如何指定表显式表映射?

  2. 如何指定自定义列映射。

  3. 我必须为主/外键指定什么特别的东西吗

编辑

澄清

  1. 说我在数据库MyAccounts中有一个表,我想将该表映射到实体Accounts。

  2. 假设我有一个列密码,并且希望该密码映射到POCO属性PasswordHash


阅读 164

收藏
2021-05-10

共1个答案

admin

  1. 要指定数据库表的名称,可以使用属性或流利的API:

使用属性:

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

使用Fluent API:

    public class YourContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Language>(entity => {
            entity.ToTable("MyAccountsTable");
        });
    }
}
  1. 要手动命名列,这非常相似,您可以使用属性或流畅的API:

使用属性:

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

}

使用Fluent API:

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