#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. Спасибо за подробное объяснение. Приветствуется!