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