Первое, что я бы порекомендовал, это назвать ваш User
класс ApplicationUser
, так как это рекомендуемая практика при расширении модели IdentityUser
. Этот стандарт именования может помочь предотвратить конфликты имен, которые могут возникнуть по мере роста вашего приложения. Я буду ссылаться на ваш User
класс как ApplicationUser
в этом коде ответа и примера. Кроме того, я предполагаю, что вы используете Entity Framework Core в этом сценарии. Если вы используете другой ORM, ваш пробег может отличаться.
Существует несколько способов определить отношение «многие к одному» между UserClass
и ApplicationUser
. Самое простое решение - создать полностью определенную связь, что, в основном, и сделано.
public class UserClass
{
public int UserClassId { get; set; }
public IEnumerable<ApplicationUser> ApplicationUsers { get; set; }
}
public class ApplicationUser : IdentityUser<int>
{
public int UserClassId { get; set; }
public UserClass UserClass { get; set; }
}
В этом примере мы определили внешний ключ для класса ApplicationUser
, а также определили publi c UserClass
собственность на это. Одним из изменений, которое я сделал, было удаление виртуального модификатора у пользователей, перечисленных в вашей UserClass
модели. В EF Core виртуальные коллекции используются для отложенной загрузки и требуют дополнительной настройки для правильной работы. Если это то, что вам конкретно требуется, то я рекомендую прочитать об этом больше в документации по EF Core. Я также использовал IEnumerable
для коллекций, но вы можете определить, что работает лучше для вас.
EF Core должен иметь возможность автоматически настраивать отношения, если они правильно определены и используют правильные соглашения об именах. Чтобы вручную настроить его, я поставлю код ниже. Обычно я предпочитаю go вперед и вручную настраивать отношения независимо от того, может ли EF Core делать это автоматически.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>()
.HasOne(p => p.UserClass)
.WithMany(b => b.ApplicationUsers);
}
Вы также можете вручную настроить внешний ключ как таковой вместе со значениями ограничения.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>()
.HasOne(p => p.UserClass)
.WithMany(b => b.ApplicationUsers)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasForeignKey(p => p.UserClassId);
}
Вы должны определить отношение только одним способом, в данном случае из ApplicationUser
сторона, для EF Core, чтобы поднять его. Если нет, вы можете прочитать документы для рекомендуемых решений. Ниже приведена ссылка на документацию EF Core, касающуюся отношений.
https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key
Редактировать: Добавить пример конфигурации ограничения.