インターネットテンプレートに基づいたASP.NETMVC4サイトがあります。そのテンプレートで設定したSimpleMembershipを使用しています。
作成されたUsersテーブルを変更できますが、追加した追加フィールドを変更する「正しい」方法がわかりません。フルネーム、電子メールなどが必要で、それらをユーザーテーブルに追加しましたが、SimpleMembershipWebSecurity。*静的メソッドを使用して更新する方法がありません。
SimpleMembership APIの外部でEFを使用して、これらのプロパティを自分で更新することになっていますか?
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の列を通知します。また、ユーザー、ロールを追加し、その2つをSeedメソッドとカスタム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 /
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のカスタマイズとシードはこちら に関する詳細情報もあります。
accountcontroller
の273行目を右に見ると、この行が見つかります
db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
OOTB彼ら(MS)はあなたが提案した通りにやっていて、EFを使って更新しているようです。
私も、これらのプロパティを更新してアクセスするための「正しい」方法を探しています。
編集:
これが私の解決策です(誰かがOOTBこれを行う方法があると言ったら嬉しいです)。
UserProfile
(SimpleMembership
の.netエンティティ)をセッションクラスでラップします。
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ブロックは、現在のセッションで設定されていない場合に、アクセスして取得しようとすることを保証するだけです。
あなたはそれらをあなたのデータベースに追加する必要があります(説明に従って行われます)
変更しない限り、それらをビューに追加します(編集、追加、削除、および表示)。
userProfilesでモデルに追加します
その後、それは動作します。