19

インターネット テンプレートに基づいた ASP.NET MVC 4 サイトがあります。そのテンプレートで設定した SimpleMembership を使用しています。

私のために作成されたユーザー テーブルを変更できますが、追加した余分なフィールドを変更する「正しい」方法がわかりません。Fullname、Email などが必要で、それらをユーザー テーブルに追加しましたが、SimpleMembership WebSecurity.* 静的メソッドを介して更新する方法がないようです。

SimpleMembership API の外部で EF を使用してこれらのプロパティを自分で更新するだけですか?

4

4 に答える 4

22

1-できればEntityFramework5を使用して移行を有効にする必要があります

2-移動します

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

YourMvcApp / Migrations/Configuration.csクラスのSeedメソッドに

    protected override void Seed(UsersContext context)
    {
        WebSecurity.InitializeDatabaseConnection(
            "DefaultConnection",
            "UserProfile",
            "UserId",
            "UserName", autoCreateTables: true);

        if (!Roles.RoleExists("Administrator"))
            Roles.CreateRole("Administrator");

        if (!WebSecurity.UserExists("lelong37"))
            WebSecurity.CreateUserAndAccount(
                "lelong37",
                "password",
                new {Mobile = "+19725000000", IsSmsVerified = false});

        if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
    }

これで、EF5がUserProfileテーブルの作成を担当します。その後、WebSecurity.InitializeDatabaseConnectionを呼び出して、SimpleMembershipProviderを作成済みのUserProfileテーブルにのみ登録し、SimpleMembershipProviderにUserIdとUserNameの列を通知します。また、ユーザー、ロールを追加し、Seedメソッドで2つをカスタムUserProfileプロパティ/フィールド(ユーザーのモバイル(番号)やIsSmsVerifiedなど)に関連付ける方法の例も示しています。

3-パッケージマネージャーコンソールからupdate-databaseを実行すると、EF5はすべてのカスタムプロパティを使用してテーブルをプロビジョニングします

その他の参考資料については、ソースコードを含むこの記事を参照してください:http: //blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -user-properties /

于 2012-09-28T17:45:15.307 に答える
15

SimpleMembershipを使用してプロファイルを簡単に変更できるようになりました。SimpleMembershipはコードファーストEFモデルを使用しており、ユーザープロファイルはMVC 4のインターネットテンプレートの一部として生成されるファイルAccountModels.csで定義されます。クラスUserProfileを変更し、クラス定義に新しいフィールドを追加するだけです。たとえば、電子メールのフィールドを追加すると、次のようになります。

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

メールフィールドにアクセスする方法の例を次に示します。

var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var email = user.Email;

電子メールフィールドを追加した後のデータベースは次のようになります。

ここに画像の説明を入力してください

SimpleMembershipの変更点のいくつかを説明する優れたブログがここにあります。SimpleMembershipのカスタマイズとシードに関する詳細については、こちらをご覧ください。

于 2012-09-10T14:39:38.427 に答える
4

の 273 行目付近を見ると、accountcontrollerこの行が見つかります。

db.UserProfiles.Add(new UserProfile { UserName = model.UserName });

あなたが提案したのと同じように彼ら(MS)がやっているOOTBでさえ、EFを使って更新しているように見えます。

私も、これらのプロパティを更新してアクセスする「正しい」方法を探しています。

編集:

これが私の解決策です(これを行うOOTBの方法があると誰かが言ってくれたらうれしいです)。

セッション クラスでUserProfile( の .net エンティティ) をラップします。SimpleMembership

public static class sessionHelpers {
     public static UserProfile userProfile
        {
            get
            {
                if (HttpContext.Current.Session["userProfile"] != null)
                {
                    return HttpContext.Current.Session["userProfile"] as UserProfile; 
                }
                else
                {
                    using (UsersContext db = new UsersContext())
                    {
                        HttpContext.Current.Session["userInfo"] =
                        db.UserProfiles.Where(x => x.UserName == 
                            HttpContext.Current.User.Identity.Name).FirstOrDefault();

                   return db.UserProfiles.Where(x => x.UserName == 
                       HttpContext.Current.User.Identity.Name).FirstOrDefault();
                    }
                }
            }
            set { HttpContext.Current.Session["userProfile"] = value; }
        }
}

これから、次のようにしてプロファイルテーブルにアクセスできます

string foo = sessionHelpers.userProfile.FIELDNAME;

sessionHelpers私のラッパークラスはどこですか。if ブロックは、現在のセッションで設定されていない場合、アクセスすると取得が試行されることを保証します。

于 2012-09-10T13:21:03.727 に答える
1

それらをデータベースに追加する必要があります(説明に従って行います)

変更されていない限り、それらをビューに追加します ( edit 、 add 、 delete 、および view )

それらを UserProfiles のモデルに追加します

それはうまくいくでしょう。

于 2013-07-19T20:15:31.387 に答える