Как добавить отношение один ко многим, используя IdentityUser, столько же, сколько и другой объект, используя один в webapi do tnet 3 - PullRequest
0 голосов
/ 16 марта 2020

как сделать связь один-ко-многим между пользователем: IdentityUser, как много пользователей к одному классу пользователя

, я пробую это

    public class UserClass
{
    public int UserClassId  { get; set; }
    public virtual ICollection<User> Users { get; set; }

}

    public class User : IdentityUser<int>
{

    public int UserClassId { get; set; }
    public UserClass UserClass { get; set; }

}

и пробую Fluent API, например это

       builder.Entity<UserClass>()
            .HasMany<User>(u=>u.Users)
            .WithOne(p=>p.UserClass)
            .HasForeignKey(p=>p.UserClassId);

то же самое не работает и спасибо

1 Ответ

0 голосов
/ 16 марта 2020

Первое, что я бы порекомендовал, это назвать ваш 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

Редактировать: Добавить пример конфигурации ограничения.

...