gpt4 book ai didi

c# - 在 Mvc 4 中使用 table-per-type 继承将对象添加到数据库

转载 作者:搜寻专家 更新时间:2023-10-30 20:19:16 25 4
gpt4 key购买 nike

我有一个类Landlord继承自 UserProfile使用 table-per-type 继承。

当新用户在应用程序上注册时,他们输入一些条件并选择他们想要的帐户类型,LandlordTenant .

这是我的 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表,正确地,说一个 UserProfileId共 1 个。

然后,if (model.AccountType == AccountType.Tenant)会看到所选帐户类型为 Tenant ,将用户添加到该角色,带有 UserProfileId 1 和一个 RoleId共 1 个。在此 if-statement 内, 因为选择的角色是 Tenant , 我创建了一个新的 Tenant像这样:var tenant = db.UserProfile.Create<Tenant>();并将其保存到数据库中(使用正确的 UserProfileID 作为 PK)。

问题:两个UserProfile实体(两行)被添加到 UserProfile每次我尝试注册一个用户时。我知道这可能是因为我调用 WebSecurity.CreateUserAndAccount我正在创建一个新的 Tenant对象。

如何避免这种情况?

如何添加正在使用的模型 WebSecurity.CreateUserAndAccount进入UserProfile表和 Tenant表一次?

最佳答案

不是调用 WebSecurity.CreateUserAndAccount() 并分别创建 UserProfile 子类 Tenent 或 Landlord,这会导致 UserProfile 表中出现重复条目​​,您可以只创建子类(还提供值对于 UserProfile),然后调用方法 WebSecurity.CreateAccount()

这是我解决问题的方法(我的子类称为 Physician):

在 AccountModels 中,我使用 table-per-type 继承添加了子类:

public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}

public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<Physician> Physicians { get; set; }
}

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

[Table("Physicians")]
public class Physician : UserProfile
{
public Guid PhysicianGUID { get; set; }
public string Name { get; set; }
}

在 AccountController/Register 方法中:

if (ModelState.IsValid)
{
// Attempt to register the user
try
{
using( UsersContext dbContext = new UsersContext()){
dbContext.Physicians.Add(new Physician { UserName = model.UserName, Name = "testDoctor", PhysicianGUID = Guid.NewGuid() });
dbContext.SaveChanges();
}
WebSecurity.CreateAccount(model.UserName, model.Password);
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}

关于c# - 在 Mvc 4 中使用 table-per-type 继承将对象添加到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com