Sobes.tech
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 Companies ir Employees. Lentelėje Employees yra stulpelis CompanyId (išorinis raktas), nurodantis į Id (pirminį raktą) Companies lentelė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" });