Отношение «один ко многим» между пользовательской моделью и AspNetUsers

#c# #asp.net-core #entity-framework-core

#c# #asp.net-ядро #сущность-фреймворк-ядро

Вопрос:

Я хочу создать отношение «один ко многим» между пользовательской таблицей (вызываемой Organization ) и AspNetUsers

  • Каждый пользователь может принадлежать только одной организации
  • В каждой организации может быть много пользователей

Я бы хотел Organization , чтобы в таблице был столбец, содержащий каждого пользователя, принадлежащего к этой организации.

Причина, по которой мне это нужно -> для любого Organization , мне нужно иметь возможность извлекать всех пользователей из этой организации.

Organization Модель имеет свойство — ICollection ApplicationUser:

 public class Organization
    {
        public int Id { get; set; }
        public string Name { get; set; }
        
        public ICollection<ApplicationUser> ApplicationUsers { get; set; }
    }
 

В модели ApplicationUser:

     public class ApplicationUser : IdentityUser
    {
        public Organization Organization { get; set; }
    }
 

На этом этапе, когда я добавляю миграцию и обновляю базу данных:

  • Я получаю столбец для организации в AspNetUsers таблице: Organization_Id
  • Но я не получаю столбец для списка пользователей в Organization таблице

Это мой AppDbContext :

 public class AppDbContext : IdentityDbContext<ApplicationUser>
    {
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        {
 
        }
        public DbSet<Orgnization> Organization{ get; set; }
 
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
 
            builder.Entity<Organization>(b =>
            {
                b.HasKey(p => p.Id);
 
                b.HasMany(p => p.ApplicationUsers)
                .WithOne(p => p.Organization);
            });

 

Заранее спасибо за любую помощь

Комментарии:

1. «Но я не получаю столбец для списка пользователей в таблице организации» — это ожидаемо. Как список пользователей может храниться в столбце в реляционной базе данных? Отношения «один ко многим» всегда работают таким образом, и вам ничего подобного не нужно. Учитывая вашу конфигурацию, Organization.ApplicationUsers будет собираться коллекция всех пользователей, принадлежащих к этой организации, всякий раз, когда вы запрашиваете ее с помощью EF. Пример: from org in ctx.Organizations where org.ApplicationUsers.Any() select org

2. @AluanHaddad спасибо, теперь я понимаю.

Ответ №1:

Я получаю столбец для организации в таблице AspNetUsers: Organization_Id, но я не получаю столбец для списка пользователей в таблице организации

Это соглашение по умолчанию при создании отношений «один ко многим» в EF core, после настройки отношений между ними мы могли бы найти связанные объекты с помощью свойства навигации.

Более подробную информацию см. в следующих руководствах:

Соглашения об отношениях «один ко многим» в ядре Entity Framework

Настройка отношений «один ко многим» в Entity Framework Core

для любой организации мне нужно иметь возможность извлекать всех пользователей из этой организации.

Чтобы загрузить связанные объекты, вы могли бы использовать Include метод, проверьте инструкцию linq в методе action:

 public class HomeController : Controller
{ 
    private readonly ApplicationDbContext _context; 
    public HomeController(ApplicationDbContext context)
    { 
        _context = context;
    }
     

    public IActionResult Index()
    {
        if (User.Identity.IsAuthenticated)
        {
            //Based on user's name to get the organization.
            var organization = _context.Organization.Include(c=>c.ApplicationUsers).Where(c => c.ApplicationUsers.Any(d => d.UserName == User.Identity.Name)).ToList();
              
            //require using Microsoft.EntityFrameworkCore;
            //based on the organization name, find all users belong to the specific organization.
            var result = _context.Organization.Include(c => c.ApplicationUsers).Where(c => c.Name == "microsoft")
                .SelectMany(c => c.ApplicationUsers.Select(d => new { UserName = d.UserName, OrganizationName = c.Name })).ToList();

        }
        return View();
    }
 

Скриншот отладки, как показано ниже:

введите описание изображения здесь

Более подробную информацию см. в разделе Загрузка связанных данных и учебное пособие: чтение связанных данных — ASP.NET MVC с ядром EF

Комментарии:

1. Спасибо за подробное объяснение. Приветствуется!