Sobes.tech
Middle

Kako implementirati vezu 'jedan prema više' u bazi podataka ili u C# kodu?

sobes.tech АИ

Одговор од АИ

U bazi podataka:

  • Kreira se tabela za "jednog" (roditelja) i tabela za "mnoge" (decu).
  • U tabelu "mnogih" se dodaje strani ključ koji se odnosi na primarni ključ tabele "jednog".
  • Primer: Tabele Companies i Employees. U tabeli Employees postoji kolona CompanyId (strani ključ), koja se odnosi na Id (primarni ključ) u tabeli Companies.

U C# kodu:

Sa korišćenjem Entity Framework Core:

  • Definišu se modeli klasa za roditelja i decu.
  • Klasa roditelja uključuje kolekciju podobjekata.
  • Klasa deteta uključuje referencu na roditeljski objekat i strani ključ.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Navigaciona svojstvo za "mnoge"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Strani ključ
        public Company Company { get; set; } // Navigaciona svojstvo za "jedan"
    }
    
  • U kontekstu baze podataka se podešavaju veze (ponekad Entity Framework Core može da ih odredi po konvenciji).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Izričito navođenje veze (nije uvek obavezno)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Kompanija ima mnogo zaposlenih
                .WithOne(e => e.Company) // Zaposleni ima jednu kompaniju
                .HasForeignKey(e => e.CompanyId); // Strani ključ u tabeli Employee
        }
    }
    

Bez ORM (ručno):

  • Dobijanje podataka iz baze pomoću JOIN upita.
    // Primer SQL upita
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Kreiranje odgovarajućih klasa i ručno povezivanje objekata nakon dobijanja podataka.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Kolekcija za čuvanje povezanih objekata
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Primer kreiranja objekata nakon dobijanja podataka
    // 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" });