40

新しいASPMVC4機能に直面しました。これには、新しいメンバーシップデータベーススキーマと新しい初期化が付属しています。mvc 3以前のバージョンでは、開発者はweb.configの仕様を使用してカスタムユーザープロファイルフィールドを作成できましたが、デフォルトのmvc4プロジェクトのfilters名前空間のメソッドに直面しました。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

およびユーザープロファイルテーブル:

[Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
    }

ただし、InitializeDatabaseConnectionメソッドはUserNameとUserIdのみを生成し、他の追加フィールドを生成する必要があります。

私はEFcodeFirstアプローチの経験が豊富で、その場合はUserProfileクラスを編集しようとします。

[Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Column]
        [Required]
        public string UserName { get; set; }
        [Column]
        [Required]
        public string FirstName { get; set; }
        [Column]
        [Required]
        public string LastName { get; set; }
    }

しかし、データベースを再生成すると、変更が表示されず、カスタムDbフィールドが生成されません。助けてください、カスタムユーザーフィールドを作成するにはどうすればよいですか?

4

5 に答える 5

52

上記の回答からの詳細

メソッドのWebSecurity.InitializeDatabaseConnectionヘルプには、

ユーザー プロファイル情報 (ユーザー名、電子メール アドレスなど) を含むデータベース テーブルを使用する場合は、メンバーシップ システムがその情報に接続するために使用する接続文字列とテーブル名を指定します。既存のユーザー プロファイル テーブルを使用したくない場合は、InitializeDatabaseConnection() メソッドがユーザー プロファイル テーブルを自動的に作成するように指定できます。(ユーザー プロファイル テーブルのデータベースが既に存在している必要があります。)

したがって、テーブルにさらに多くのフィールドがUserProfile必要な場合は、プロファイル テーブルを作成していることを確認しInitializeDatabaseConnection、テーブルが既に配置された後にメソッドを実行する必要があります。

VS2012 の標準 MVC4.0 プロジェクト テンプレートでは、アカウント コントローラーをコメントアウトしました。

[Authorize]
//[InitializeSimpleMembership]
public class AccountController : Controller
{

InitializeDatabaseConnectionEF Code First Database Initializerに移動しました

public class MyDatabaseInit: DropCreateDatabaseAlways<MyDatabaseContext>
{
    protected override void Seed(MyDatabaseContext context)
    {
        SeedMembership();
    }

    private void SeedMembership()
    {
        WebSecurity.InitializeDatabaseConnection("MyDatabaseContext",
            "UserProfile", "UserId", "UserName", autoCreateTables: true);
    } 
}

InitializeDatabaseConnectionテーブルが既に配置されている場合は、確実に実行されます。

UserProfileクラスを EF Code First モデルに追加しました

public class MyDatabaseContext : DbContext
{
    public DbSet<UserProfile> UserProfiles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

UserProfileテーブルに余分なフィールドを追加しました

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string MobilePhone { get; set; }
}

ここで必要なのは、アプリケーションの起動時にデータベースの初期化戦略を設定し、データベースに対してクエリを呼び出して、承認/認証コードが呼び出される前にその時点でデータベースが作成されるようにすることだけです。

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<MyDatabaseContext>(new MyDatabaseInit());
   new MyDatabaseContext().UserProfile.Find(1);
}
于 2012-09-17T14:28:05.113 に答える
18

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します。コードに何かが残っている場合)。
于 2013-10-09T15:21:00.030 に答える
6

データベースに新しいテーブルを追加し、それを User_Details などと呼びます。ユーザーの作成時に、ユーザーの ID を取得し、詳細を新しいテーブルに強制することができます。これは 1 つの簡単なオプションです。

于 2013-01-07T16:27:45.537 に答える
3

VS2012 または VS2010 に同梱されている MVC4 インターネット プロジェクト テンプレートをご覧ください。userprofile クラスの列を変更する前に、データベースが作成されていないことを確認する必要があります。POCO クラスにさらにプロパティを追加してから、データベースを再生成できます。データベースの生成後にプロパティを追加する場合は、EF 移行を使用してそれらの新しいプロパティをデータベースに追加していることを確認してください。

于 2012-09-16T20:35:57.640 に答える