Обычно с EF вы отображаете отношения между сущностями с FK и позволяете EF управлять назначением FK при сохранении основной записи и связанных записей. Однако в вашем случае отношения относительно слабо связаны.
Будут ли все записи пациентов связаны с аутентифицированными пользователями ASP.Net? Если это так, вы можете посмотреть на изменение типа PK в Patient в соответствии с таблицей ASPNet, а затем настроить Patient как отношение 1-к-1 к ASPNetUser.
В качестве альтернативы, если пациенты могут быть ASPNetUsers (но также могут быть разобщены), я бы посмотрел на добавление столбца PatientId в качестве автоинкрементного целого или последовательного GUID (newsequentialId ()) в ASPNetUser и сопоставление этого с PatientId в пациенте как необязательно или требуется много-к-1. Это позволяет избежать уродливости строки PK в ASPNetUser и позволяет вам использовать тип FK, который больше подходит для вашего приложения. (Int или GUID)
Третий вариант, который вы можете использовать, чтобы получить этот недавно вставленный PK; PK будет создан только после DbContext SaveChanges, поэтому вам придется дважды вызывать SaveChanges, чтобы получить первый идентификатор:
//...
var user = new ApplicationUser { UserName = pv.Email, Email = pv.Email };
var result = await UserManager.CreateAsync(user, pv.Password);
if (result.Succeeded)
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
else
return View(pv);
_context.SaveChanges();
Patient p = new Patient();
p.PatientId = Guid.Parse(user.UserId); // User ID will be populated after the above SaveChanges call.
p.FirstName = pv.FirstName;
//...
_context.SaveChanges(); //Save the Patient.
Как правило, хотя это и не идеально, так как вы можете получить ситуацию, когда первый SaveChanges завершается успешно, а второй - нет. Эти записи, вероятно, должны проходить вместе, так что это может быть достигнуто с помощью области транзакций или с помощью модуля или работы, такой как DbContextScope.
Использование TransactionScope:
using (var tx = new TransactionScope())
{
var user = new ApplicationUser { UserName = pv.Email, Email = pv.Email };
var result = await UserManager.CreateAsync(user, pv.Password);
if (result.Succeeded)
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
else
return View(pv);
_context.SaveChanges();
Patient p = new Patient();
p.PatientId = Guid.Parse(user.UserId); // User ID will be populated after the above SaveChanges call.
p.FirstName = pv.FirstName;
//...
_context.SaveChanges(); //Save the Patient.
tx.Complete()
}
В целом, однако, отображение отношений между объектами было бы лучшим вариантом, потому что тогда ограничения FK могут быть установлены для управления такими вещами, как каскадное удаление.