Sobes.tech
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 Companies un Employees. Tabulā Employees ir kolonna CompanyId (ārējā atslēga), kas atsaucas uz Id (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" });