Middle
Kā īstenot 'viens pret daudz' saiti datu bāzē vai C# kodā?
sobes.tech AI
Atbilde no AI
Datu bāzē:
- Tiek izveidota tabula "vienam" (vecākiem) un tabula "daudziem" (bērniem).
- Daudziem tabulā tiek pievienots ārējais atslēgas lauks, kas atsaucas uz "viena" tabulas primāro atslēgu.
- Piemērs: tabulas
CompaniesunEmployees. TabulāEmployeesir kolonnaCompanyId(ārējā atslēga), kas atsaucas uzId(primāro atslēgu) tabulāCompanies.
C# kodā:
Ar Entity Framework Core:
- Definē modeļa klases vecākam un bērniem:
- Vecāka klase ietver kolekciju bērnu objektu:
- Bērna klase ietver atsauci uz vecāka objektu un ārējo atslēgu:
public class Company { public int Id { get; set; } public string Name { get; set; } public ICollection<Employee> Employees { get; set; } // Navigācijas īpašība "daudziem" } public class Employee { public int Id { get; set; } public string Name { get; set; } public int CompanyId { get; set; } // Ārējā atslēga public Company Company { get; set; } // Navigācijas īpašība "vienam" } - Datu bāzes kontekstā tiek iestatītas saites (dažreiz Entity Framework Core tās var noteikt pēc konvencijas):
public class ApplicationDbContext : DbContext { public DbSet<Company> Companies { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Skaidrs saites norādījums (ne vienmēr obligāts) modelBuilder.Entity<Company>() .HasMany(c => c.Employees) // Uzņēmums ir ar daudz darbinieku .WithOne(e => e.Company) // Darbiniekam ir viena kompānija .HasForeignKey(e => e.CompanyId); // Ārējā atslēga darbinieku tabulā } }
Bez ORM (ar roku):
- Datu iegūšana no DB, izmantojot JOIN vaicājumus:
// SQL vaicājuma piemērs // SELECT c.Name AS CompanyName, e.Name AS EmployeeName // FROM Companies c // JOIN Employees e ON c.Id = e.CompanyId; - Atbilstošu klases izveide un objektu manuāla sasaistīšana pēc datu iegūšanas:
public class Company { public string Name { get; set; } public List<Employee> Employees { get; set; } // Kolekcija saistīto objektu glabāšanai } public class Employee { public string Name { get; set; } } // Piemērs — objektu izveide pēc datu iegūšanas // 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" });