web-dev-qa-db-ja.com

ASP.NET IDを使用しているときにテーブル名を変更する方法を教えてください。

MSDN 2013-10-18からダウンロードしたVisual Studio 2013のリリースバージョン(RCではなくRTM)を使用しているため、AspNet.Identityの最新(RTM)バージョンを使用しています。新しいWebプロジェクトを作成するときに、認証用に[Individual User Accounts]を選択します。これにより、以下のテーブルが作成されます。

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

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

  1. Id
  2. UserName
  3. PasswordHash
  4. SecurityStamp
  5. 弁別器

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

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

- UPDATE -

@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");
    }
}

Database Tables

- 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");
    }
197
user2315985

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

DbContextでOnModelCreatingをオーバーライドして、以下を追加します。これによりAspNetUserテーブルが "Users"に変更されます。また、デフォルトのId列がUser_Idになるフィールド名を変更することもできます。

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

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

それが役立つことを願っています。

121
Piotr Stulinski

以下が私の実用的な解決策です:

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

        modelBuilder.Entity<ApplicationUser>().ToTable("User");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

詳しくは this をご覧ください。

55
Frank Myat Thu

DbContextクラスでこのメソッドをオーバーライドして、選択したテーブルにマップすることができます。

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");
15
Hao Kung

設定クラスを作成して、各Identityクラスの詳細すべてを指定することもできます。次に例を示します。

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

そして、これらの設定をOnModelCreating()メソッドに含めます。

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

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

これにより、Identityクラスのあらゆる側面を完全に制御できます。

1
Manish

Asp.netのIDのデフォルトのテーブル名は次のように変更できます。

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

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

さらに、各クラスを拡張し、 'IdentityUser'、 'IdentityRole'などのクラスに任意のプロパティを追加することもできます。

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    // Add additional items here as needed
}

時間を節約するために、 AspNet Identity 2.0 Extensible Project Template を使用してすべてのクラスを拡張できます。

0
Arvand

ただし、.NET CORE(MVC 6)では機能しません。そのため、バインディングを

のような

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityRole>().ToTable("Role");
    builder.Entity<IdentityUser>(entity => 
    {
        entity.ToTable("User");
        entity.Property(p => p.Id).HasColumnName("UserId");
    });
}

それは誰かを助けるかもしれない:)

0
dnxit