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" });