在常规的aspnet_Users表中,我创建了两个在UserId上具有一对一关系的子表。
Table UserClient
-UserId int PK
-ClientNumber int
Table UserEmployee
-UserId int PK
-EmployeeNumber int
我在edmx中创建了一个Table per Type模型,现在希望在通过成员资格存储过程创建新的aspnet_User记录时在相应的子表中创建相应的记录,如下所示:
[HttpPost]
public ActionResult CreateUser(CreateUserModel model)
{
if (ModelState.IsValid)
{
// Attempt to create the user
MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);
if (createStatus == MembershipCreateStatus.Success)
{
//now that the aspnet_user record is created...
FilingBizEntities db = new FilingBizEntities();
//Get the role chosen for the user from selectlist on the CreateUser page
var thisrole = db.aspnet_Role.Where(rn => rn.RoleId == model.RoleId).FirstOrDefault();
//Add the user to the role
Roles.AddUserToRole(model.UserName, thisrole.RoleName);
return RedirectToAction("Index", "Users");
}
else
{
ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
}
}
ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
return View(model);
}
它是“UserClient”类型还是“UserEmployee”依赖于它的RoleId,我目前在查询需要时区分它。现在我希望通过表来扩展每个类型的属性。
假设新创建的用户是客户端。
如何使用aspnet_Users的UserId和此ClientNumber将记录插入UserClient表?
答案 0 :(得分:1)
为现有用户创建客户端的最佳方法是使用存储过程;不是通过映射连接到客户端实体的存储过程,而是可以从代码中显式调用的单独存储过程。
理想情况下,它是一个SP,它将UserId作为参数,使用该UserId将新行插入UserClient表,然后返回一个完整的Client对象,以便可以立即使用它。
答案 1 :(得分:1)
创建一个免费表是不是更有意义,让我们称之为“用户”并将TPT应用于该表?
您的“用户”表格会有一个FK到“aspnet_Users”表(guid或电子邮件)。然后让你的两个表派生自那个表。
如果您想要执行特定于身份验证/成员身份的操作,请使用内置成员资格提供程序API。
如果您想要针对您的域模型执行特定操作,请使用您的TPH模型。
在上面的示例(“创建模型”方法)中,调用Membership API方法:MembershipService.CreateUser
(正如您所做),然后如果成功,则调用另一个名为UserDomainService.CreateUser
的方法接受刚创建的用户的FK(guid或电子邮件),并将新用户保留到TPH模型中。