個人的には、SQL プロファイル プロバイダー (あなたが使用しているもの) を使用しないことをお勧めします。MVC2 以降 (さらに言えば、.NET 2.0 で Web フォームに導入されて以来)、プロファイルは何も変更されていません。
その理由は次のとおりです。プロファイル データは XML としてデータベースに保存されるため、アプリの外部 (つまり、純粋な SQL クエリ) でプロファイル データを使用することは非常に困難です。
データベースにプロファイル フィールドを直接作成する方が、おそらくはるかに優れています。このようにして、データがどのテーブル/列から来ているかを知り、必要に応じてビューを作成できます。それ以外の場合は、テーブル列の XML を解析してプロファイル データを抽出する必要があります (これは、.NET で ProfileCommon が行うことです)。
コメントへの返信
まず、物件名を間違えていました。ではProviderUserKey
ありませんProviderKey
。ただし、匿名ユーザーのプロファイル プロパティを保存する場合を除きMembershipUser.UserName
、FK 値も一意であるため、FK 値と同じように簡単に使用できます。
[HttpPost]
public ActionResult Register(RegisterModel model)
{
MembershipCreateStatus createStatus;
var membershipUser = Membership.CreateUser(model.UserName, model.Password,
model.Email, null, null, true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
var providerKeyObject = membershipUser.ProviderUserKey;
var providerKeyGuid = (Guid)membershipUser.ProviderUserKey;
// Use providerKeyGuid as a foreign key when inserting into a profile
// table. You don't need a real db-level FK relationship between
// your profile table and the aspnet_Users table. You can lookup this
// Guid at any time by just getting the ProviderUserKey property of the
// MembershipUser, casting it to a Guid, and executing your SQL.
// Example using EF / DbContext
using (var db = new MyDbContext())
{
var profile = new MyProfileEntity
{
UserId = providerKeyGuid, // assumes this property is a Guid
FirstName = model.FirstName,
LastName = model.LastName,
};
db.Set<MyProfileEntity>().Add(profile);
db.SaveChanges();
}
// you could get the profile back out like this
using (var db = new MyDbContext())
{
var profile = db.Set<MyProfileEntity>().SingleOrDefault(p =>
p.UserId == (Guid)membershipUser.ProviderUserKey);
}
FormsAuthentication.SetAuthCookie(membershipUser.UserName, false);
return RedirectToAction("Index", "Home");
}
return View(model);
}
ProviderUserKey の代わりに UserName を使用する例を次に示します。匿名ユーザーのプロファイル情報を保存していない場合は、次の方法をお勧めします。
[HttpPost]
public ActionResult Register(RegisterModel model)
{
MembershipCreateStatus createStatus;
var membershipUser = Membership.CreateUser(model.UserName, model.Password,
model.Email, null, null, true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
// Example using EF / DbContext
using (var db = new MyDbContext())
{
var profile = new MyProfileEntity
{
// assumes this property is a string, not a Guid
UserId = membershipUser.UserName,
FirstName = model.FirstName,
LastName = model.LastName,
};
db.Set<MyProfileEntity>().Add(profile);
db.SaveChanges();
}
// you could get the profile back out like this, but only after the
// auth cookie is written (it populates User.Identity.Name)
using (var db = new MyDbContext())
{
var profile = db.Set<MyProfileEntity>().SingleOrDefault(p =>
p.UserId == User.Identity.Name);
}
FormsAuthentication.SetAuthCookie(membershipUser.UserName, false);
return RedirectToAction("Index", "Home");
}
return View(model);
}