Как применить таблицу EF4 для каждого типа для создания записей в подтаблицах, наследуемых от aspnet_Users? - PullRequest
1 голос
/ 23 ноября 2010

Из обычной таблицы aspnet_Users я создал две вложенные таблицы с отношением один к одному в UserId.

Table UserClient
-UserId int PK
-ClientNumber int

Table UserEmployee
-UserId int PK
-EmployeeNumber int 

Я создал модель Table per Type в edmx и теперь хочу создать соответствующуюзаписать в соответствующую подстатью, когда я создаю новую запись 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, который я в настоящее время различаю при необходимости по запросу.Теперь я хочу расширить свойства каждого типа с помощью таблиц.

Допустим, вновь созданный пользователь является клиентом.

Как вставить запись в таблицу UserClient с помощью ее пользовательского идентификатора aspnet_Users иэтот ClientNumber?

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Разве не имеет смысла создавать бесплатную таблицу, назовем ее «Пользователи» и применим к ней TPT?

Ваша таблица «Users» будет иметь FK для таблицы «aspnet_Users» (guid или email). Затем ваши две таблицы получаются из этой таблицы.

Если вы хотите сделать что-то определенное для аутентификации / членства, используйте встроенный API поставщика членства.

Если вы хотите сделать что-то определенное для вашей доменной модели, используйте вашу модель TPH.

В приведенном выше примере (метод «Создать модель») вызовите метод API-членства: MembershipService.CreateUser (как вы делаете), а затем, если это удастся, вызовите другой метод с именем UserDomainService.CreateUser, который будет принимать FK ( Guid или по электронной почте) для пользователя просто создает и сохраняет этого нового пользователя в вашей модели TPH.

1 голос
/ 23 ноября 2010

Лучший способ создать клиента для существующего пользователя - использовать хранимую процедуру ;не хранимая процедура, которая подключена к объекту клиента через сопоставления, а отдельная процедура, которая может быть вызвана явно из кода.
В идеале это будет SP, который принимает UserId в качестве параметра, вставляет новую строку в таблицу UserClient, используя этот UserId, а затем возвращает полный объект Client, чтобы его можно было использовать немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...