Sobes.tech
Middle

Как да реализираме връзка 'един към много' в база данни или в C# код?

sobes.tech AI

Отговор от 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" });