1. ホーム
  2. c#

[解決済み】ASP.NET Identityを使用する際にテーブル名を変更するには?

2022-04-18 05:27:03

質問

Visual Studio 2013 のリリース版(RTM、RCではない)を使用しており(MSDN 2013-10-18 からダウンロード)、したがって AspNet.Identity の最新(RTM)バージョンを使用しています。新しいWebプロジェクトを作成する際、認証に "個別ユーザーアカウント" を選択しました。これにより、以下のテーブルが作成されます。

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

新しいユーザーを登録すると (デフォルトのテンプレートを使用して)、これらのテーブル (上記) が作成され、AspNetUsers テーブルには、以下を含むレコードが挿入されます。

  1. ID
  2. ユーザー名
  3. パスワードハッシュ
  4. セキュリティスタンプ
  5. ディスクリミネーター

さらに、クラス "ApplicationUser" にパブリックプロパティを追加することで、AspNetUsers テーブルに "FirstName", "LastName", "PhoneNumber" などの追加のフィールドを追加することに成功しました。

ここで質問です。上記のテーブルの名前を(最初に作成したときに)変更する方法はありますか?それとも、常に、テーブルの名前に AspNet というプレフィックスをつけることができますか?もし、テーブル名を別の名前にすることができるのであれば、その方法を教えてください。

-- アップデイト --

Hao Kungさんの解決策を実行しました。これは新しいテーブルを作成しますが(例えば私はそれをMyUsersと呼びます)、AspNetUsersテーブルもまだ作成されます。目標は "AspNetUsers" テーブルを "MyUsers" テーブルと置き換えることです。以下のコードと作成されたテーブルのデータベース画像を参照してください。

実際に置き換えたいのは、それぞれの AspNet テーブルを自分の名前に置き換えたら・・・。例えば、MyRoles、MyUserClaims、MyUserLogins、MyUserRoles、MyUsersなどです。

どうすれば、1組のテーブルで済むのでしょうか?

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(): base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
    }
}

<イグ

-- update answer --

Hao KungとPeter Stulinskiの両氏に感謝します。これで私の問題は解決しました...

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
    }

解決方法は?

以下のようにIdentityModel.csを修正することで、簡単に行うことができます。

DbContext の OnModelCreating をオーバーライドして、以下を追加します。これにより、AspNetUser テーブルが "Users" に変更されます。

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

または、標準のカラム名をすべて使用したい場合は、以下のようにします。

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

以下の完全な例(これは IdentityModel.cs ファイルにあるはずです)では、ApplicationUser クラスを User という名前に変更しました。

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

現在のテーブルが存在する場合、私はこれを動作させることに成功していないことに注意してください。また、マッピングしないカラムはすべてデフォルトのものが作成されることに注意してください。

お役に立てれば幸いです。