我有一个类Landlord
继承自UserProfile
使用 table-per-type 继承。
当新用户在应用程序上注册时,他们输入一些条件并选择他们想要的帐户类型,或者Landlord
或Tenant
。
这是我的 AccountController/Register 方法:
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
Email = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
AccountType = model.AccountType.ToString()
},
false);
// Add user to role that corresponds with selected account type
if (model.AccountType == AccountType.Tenant)
{
try
{
Roles.AddUserToRole(model.UserName, "Tenant");
using (var db = new LetLordContext())
{
var tenant = db.UserProfile.Create<Tenant>();
tenant.TenantAge = null;
tenant.TenantGroupMembers = null;
tenant.UserId = WebSecurity.CurrentUserId;
tenant.UserName = model.UserName;
// more properties associated with tenant
// ...
db.UserProfile.Add(tenant);
db.SaveChanges();
}
}
catch (ArgumentException e)
{
ModelState.AddModelError("Unable to add user to role", e);
}
}
if (model.AccountType == AccountType.Landlord)
{
try
{
Roles.AddUserToRole(model.UserName, "Landlord");
using (var db = new LetLordContext())
{
var landlord = db.UserProfile.Create<Landlord>();
// same idea as adding a tenant
}
}
catch (ArgumentException e)
{
ModelState.AddModelError("Unable to add user to role", e);
}
}
return RedirectToAction("Confirm", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
例如,如果我Tenant
在注册时选择了所需的帐户类型,WebSecurity.CreateUserAndAccount
则会正确地将用户添加到UserProfile
表中,例如 aUserProfileId
为 1。
然后,if (model.AccountType == AccountType.Tenant)
会看到选定的帐户类型是Tenant
,将用户添加到该角色,aUserProfileId
为 1,aRoleId
为 1。在此范围内if-statement
,因为选定的角色是Tenant
,所以我像这样创建一个新的Tenant
:var tenant = db.UserProfile.Create<Tenant>();
并将其保存到数据库中(使用正确的 UserProfileID 作为 PK)。
问题:每次我尝试注册一个用户时,都会将两个UserProfile
实体(两行)添加到表中。UserProfile
我知道这可能是由于我正在调用WebSecurity.CreateUserAndAccount
并且我正在创建一个新Tenant
对象。
我该如何避免这种情况?
如何将正在使用的模型添加WebSecurity.CreateUserAndAccount
到UserProfile
表和Tenant
表 ONCE 中?