Sobes.tech
Middle
114
questionbank

Как реализовать связь 'один ко многим' в базе данных или в коде на C#?

Ответ от нейросети

sobes.tech AI

В базе данных:

  • Создается таблица для "одного" (родителя) и таблица для "многих" (детей).
  • В таблице "многих" добавляется внешний ключ, ссылающийся на первичный ключ таблицы "одного".
  • Пример: Таблицы Companies и Employees. В таблице Employees есть столбец CompanyId (внешний ключ), ссылающийся на Id (первичный ключ) в таблице Companies.

В коде на C#:

С использованием Entity Framework Core:

  • Определяются классы моделей для родителя и детей.
  • Класс родителя включает коллекцию дочерних объектов.
  • Класс ребенка включает ссылку на родительский объект и внешний ключ.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Навигационное свойство для "многих"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Внешний ключ
        public Company Company { get; set; } // Навигационное свойство для "одного"
    }
    
  • В контексте базы данных настраиваются взаимосвязи (иногда Entity Framework Core может определить их по соглашению).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Явное указание связи (не всегда обязательно)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // У компании много сотрудников
                .WithOne(e => e.Company) // У сотрудника одна компания
                .HasForeignKey(e => e.CompanyId); // Внешний ключ в таблице Employee
        }
    }
    

Без ORM (вручную):

  • Получение данных из БД с использованием JOIN запросов.
    // Пример SQL запроса
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Создание соответствующих классов и ручное связывание объектов после получения данных.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Коллекция для хранения связанных объектов
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Пример создания объектов после получения данных
    // Company company = new Company { Name = "ACME Corp", Employees = new List<Employee>() };
    // company.Employees.Add(new Employee { Name = "Alice" });
    // company.Employees.Add(new Employee { Name = "Bob" });