[解決済み】ASP.NET Identityを使用する際にテーブル名を変更するには?
質問
Visual Studio 2013 のリリース版(RTM、RCではない)を使用しており(MSDN 2013-10-18 からダウンロード)、したがって AspNet.Identity の最新(RTM)バージョンを使用しています。新しいWebプロジェクトを作成する際、認証に "個別ユーザーアカウント" を選択しました。これにより、以下のテーブルが作成されます。
- AspNetRoles
- AspNetUserClaims
- AspNetUserLogins
- AspNetUserRoles
- AspNetUsers
新しいユーザーを登録すると (デフォルトのテンプレートを使用して)、これらのテーブル (上記) が作成され、AspNetUsers テーブルには、以下を含むレコードが挿入されます。
- ID
- ユーザー名
- パスワードハッシュ
- セキュリティスタンプ
- ディスクリミネーター
さらに、クラス "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");
}
}
現在のテーブルが存在する場合、私はこれを動作させることに成功していないことに注意してください。また、マッピングしないカラムはすべてデフォルトのものが作成されることに注意してください。
お役に立てれば幸いです。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] Json.netでシリアライズする際、プロパティ名を変更するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】ASP.NET Identity DbContextの混乱