Sobes.tech
Middle

Jak implementovat vztah 'jeden ku mnoha' v databázi nebo v kódu C#?

sobes.tech AI

Odpověď od AI

V databázi:

  • Vytváří se tabulka pro "jednoho" (rodiče) a tabulka pro "mnohé" (děti).
  • Do tabulky "mnohých" se přidá cizí klíč odkazující na primární klíč tabulky "jednoho".
  • Příklad: Tabulky Companies a Employees. V tabulce Employees je sloupec CompanyId (cizí klíč), odkazující na Id (primární klíč) v tabulce Companies.

V kódu v C#:

S použitím Entity Framework Core:

  • Definují se třídy modelů pro rodiče a děti.
  • Třída rodiče obsahuje kolekci dětských objektů.
  • Třída dítěte obsahuje odkaz na rodičovský objekt a cizí klíč.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Navigační vlastnost pro "mnohé"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Cizí klíč
        public Company Company { get; set; } // Navigační vlastnost pro "jedno"
    }
    
  • V kontextu databáze se nastavují vztahy (někdy je Entity Framework Core může určit podle konvence).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Explicitní určení vztahu (ne vždy nutné)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Společnost má mnoho zaměstnanců
                .WithOne(e => e.Company) // Zaměstnanec má jednu společnost
                .HasForeignKey(e => e.CompanyId); // Cizí klíč v tabulce Employee
        }
    }
    

Bez ORM (ručně):

  • Získání dat z DB pomocí JOIN dotazů.
    // Příklad SQL dotazu
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Vytvoření odpovídajících tříd a ruční spojování objektů po získání dat.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Kolekce pro uložení propojených objektů
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Příklad vytvoření objektů po získání dat
    // 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" });