如何应用Table-per-type EF4在从aspnet_Users继承的子表中创建记录?

时间:2010-11-23 03:07:03

标签: asp.net entity-framework-4 table-per-type

在常规的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表?

2 个答案:

答案 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模型中。