IMLivu の回答とコメントに基づく非破壊バージョン:
この1つの問題に遭遇し、回答+コメント(+試行錯誤)から正しい方法を理解する必要があったため、カットアンドペーストできる結果を共有すると思いました. これはIMLiviuによる回答に基づいているため、彼らに完全に感謝します。EF と直接互換性があるように見えるように、既存のクラスUserProfile
とクラスを変更します。UserContext
データベースを完全に削除し、いくつかのテーブルを追加するという提案を見てぞっとしました。すべてのコメントを読んでプロトタイプを作成した後、結果は次のとおりです。
1 - Webmatrix の作成を停止する
メンバーシップ テーブルの標準の webmatrix 作成を停止します ([InitializeSimpleMembership] 属性をコメント アウトします)。
[Authorize]
//[InitializeSimpleMembership]
public class AccountController : Controller
2 - 移行構成を作成する
以下のような移行構成クラスを作成します。
public class MigrationConfiguration : DbMigrationsConfiguration<UsersContext>
{
public MigrationConfiguration()
{
this.AutomaticMigrationsEnabled = true; // This is important as it will fail in some environments (like Azure) by default
}
protected override void Seed(UsersContext context)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
}
}
3 - EF の作成から複数形を削除する
AccountModel.cs ファイルUsersContext
クラスを変更して、複数形オプションを削除します (OnModelCreating イベントを追加)。
public class UsersContext : DbContext
{
public UsersContext() : base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
4 - 新しいフィールドを UserProfile に追加する
必要な追加フィールドを UserProfile に追加します。
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; } // <<<<<<<< E.G. THIS ADDED
}
5 - アプリの起動時にテーブルを移行する
アプリが起動したら、データベースの初期化戦略を設定し、読み取りでトリガーします。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
Database.SetInitializer(new MigrateDatabaseToLatestVersion<UsersContext, MigrationConfiguration>());
new UsersContext().UserProfiles.Find(1);
}
明らかに、これをすべて機能させるには、さまざまな using ステートメントを追加する必要がありますが、右クリックの解決オプションを使用すると、それが実行されます。
その他の注意事項:
(私が行ったように) ユーザー以外のテーブルを使用することにした場合はUserProfile
、一致するようにいくつかのエントリを変更する必要があります。
SimpleMembershipInitializer
クラスでは、新しいテーブルと列の名前を参照する必要があります
- アカウント コントローラーとさまざまなログイン ビューと登録ビューで、新しいモデル フィールドを参照する必要があります (名前が変更されている場合)。
- クラスでは
UsersContext
、 Userprofile クラス名をそのままにしておくことができますがTable
、テーブル名と一致するように属性を変更する必要があります。
- クラスでは
UserProfile
、新しいテーブル フィールド名と一致するようにフィールドの名前を変更する必要があります。
webpages_UsersInRoles
データベースでは、 と の間の関係を削除し、新しいユーザー テーブルとの間の関係をUserProfile
追加する必要があります。そうしないとwebpages_UsersInRoles
、古い参照整合性チェックによって実行時に問題が発生します。(既存のテーブルを削除し、再作成されていないことを確認することを強くお勧めUserProfile
します。コードに何かが残っている場合)。