Middle
Kaip įgyvendinti 'vienas su daug' ryšį duomenų bazėje ar C# kode?
sobes.tech AI
Atsakymas iš AI
Duomenų bazėje:
- Sukuriama lentelė "vienam" (tėvui) ir lentelė "daugeliui" (vaikams).
- Daugeliui lentelėje pridedamas išorinis raktas, nurodantis į "vieno" lentelės pirminį raktą.
- Pavyzdys: lentelės
CompaniesirEmployees. LentelėjeEmployeesyra stulpelisCompanyId(išorinis raktas), nurodantis įId(pirminį raktą)Companieslentelėje.
C# kode:
Naudojant Entity Framework Core:
- Apibrėžiami modelių klasės tėvui ir vaikams:
- Tėvo klasė apima kolekciją vaikų objektų:
- Vaiko klasė apima nuorodą į tėvo objektą ir išorinį raktą:
public class Company { public int Id { get; set; } public string Name { get; set; } public ICollection<Employee> Employees { get; set; } // Navigacinis savybė "daugeliui" } public class Employee { public int Id { get; set; } public string Name { get; set; } public int CompanyId { get; set; } // Išorinis raktas public Company Company { get; set; } // Navigacinis savybė "vienam" } - Duomenų bazės kontekste nustatomos ryšiai (kartais Entity Framework Core gali juos nustatyti pagal susitarimą):
public class ApplicationDbContext : DbContext { public DbSet<Company> Companies { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Aiškus ryšio nurodymas (ne visada būtina) modelBuilder.Entity<Company>() .HasMany(c => c.Employees) // Įmonė turi daug darbuotojų .WithOne(e => e.Company) // Darbuotojas turi vieną įmonę .HasForeignKey(e => e.CompanyId); // Išorinis raktas darbuotojų lentelėje } }
Be ORM (rankiniu būdu):
- Duomenų gavimas iš DB naudojant JOIN užklausas:
// SQL užklausos pavyzdys // SELECT c.Name AS CompanyName, e.Name AS EmployeeName // FROM Companies c // JOIN Employees e ON c.Id = e.CompanyId; - Sukuriami atitinkami klasės ir rankiniu būdu sujungiami objektai po duomenų gavimo:
public class Company { public string Name { get; set; } public List<Employee> Employees { get; set; } // Kolekcija susietiems objektams } public class Employee { public string Name { get; set; } } // Pavyzdys — objektų kūrimas po duomenų gavimo // 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" });