Проблема, скорее всего, будет:
var person = new Person ();
user.UserId = person.PersonId;
Person - это спецификация Identity, у EF здесь не будет идентификатора, пока вы не вызовете SaveChanges.
Лучший способ решить эту проблему - установить отношения сущностей так, чтобы EF связывал отношение 1: 1 между пользователем и персоной в связанном идентификаторе. Я не рекомендую сопоставлять «UserID» с «PersonID», так как это довольно запутанно с точки зрения запроса данных. Просто дайте пользователю PersonId.
Для сопоставления вы можете использовать EntityTypeConfiguration или сопоставить его с modelBuilder.
например.
public class PersonConfiguration : EntityTypeConfiguration<Person>
{
public PersonConfiguration()
{
ToTable("Persons");
HasKey(x => x.PersonId)
.Property( x=> x.PersonId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasOne(x => x.User)
.WithRequiredDependency()
.HasForeignKey(x => x.PersonId);
}
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public PersonConfiguration()
{
ToTable("Users");
HasKey(x => x.PersonId);
}
}
Затем, когда вы идете, чтобы вставить пользователя / человека:
var person = new Person
{
// populate Person details...
User = new User
{
// populate user details... Don't worry about PersonId...
}
}
dbContext.Persons.Add(person);
dbContext.SaveChanges();
Роли пользователей будут следовать сопоставлению «многие ко многим» между пользователями и ролями. В зависимости от схемы это может быть сделано с или без связывающей сущности (UserRole), хотя обычно проще использовать связывающую сущность, поэтому я рекомендую прочитать, как они отображаются. Для таких вещей, как отслеживание изменений (CreatedAt / CreatedBy и т. Д.), Вам понадобится связать сущности, так как объединения без объединения «многие ко многим» поддерживают только таблицы только с 2x FK, без других столбцов.