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
CompaniesiEmployees. U tabeliEmployeespostoji kolonaCompanyId(strani ključ), koja se odnosi naId(primarni ključ) u tabeliCompanies.
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" });