Entity Frameworkのコアテーブルマッピングを指定する方法

asp.net-core entity-framework-core sql

質問

私は動作するシンプルなEntity Framework ASPコアアプリケーションを作ったが、私はその理由を知らない:

私はこのような文脈を作った:

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

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

そして私はこのようなモデルを持つ2つのテーブルを持っています:

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

興味深いのは、アプリケーションを実行すると実際にデータを取得できることです。私はテーブルマッピングを指定していないのでちょっと変わったようです。指定されたテーブルが同じ名前なので、私はこれをautomapsと仮定しています。

私の質問は次のとおりです:

  1. モデル名をDBと完全に同じにしたくない場合は、テーブルの明示的なテーブルマッピングを指定するにはどうすればよいですか?

  2. カスタム列マッピングを指定する方法

  3. プライマリ/外部キーに指定する必要がある特別なものはありますか?

編集

明確にするために

  1. DB MyAccountsにテーブルがあり、これをエンティティのアカウントにマップしたいとします。

  2. 列のパスワードがあり、POCOプロパティのPasswordHashにマップする必要があるとします

受け入れられた回答

  1. データベーステーブルの名前を指定するには、属性またはFluent 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");
            });
        }
    }
    
  2. 列に手動で名前を付ける方法は非常によく似ています。属性またはFluent 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")
            );
        }
    }
    


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ