Middle
Hogyan valósítható meg egy 'egy a sokhoz' kapcsolat adatbázisban vagy C# kódban?
sobes.tech MI
Válasz az MI-től
Az adatbázisban:
- Létrejön egy tábla az "egy" (szülő) és egy tábla a "sok" (gyermekek) számára.
- A "sok" táblába külső kulcs kerül, amely a "egy" tábla elsődleges kulcsára hivatkozik.
- Példa:
CompaniesésEmployeestáblák. AzEmployeestáblában van egyCompanyId(külső kulcs) oszlop, amely aCompaniestáblaId(elsődleges kulcs) oszlopára hivatkozik.
C# kódban:
Entity Framework Core használatával:
- Modellosztályokat definiálnak az anya- és gyermekobjektumok számára.
- Az anyaosztály tartalmaz egy gyűjteményt a gyermekobjektumokból.
- A gyermekosztály tartalmaz egy hivatkozást az anyaobjektumra és a külső kulcsot.
public class Company { public int Id { get; set; } public string Name { get; set; } public ICollection<Employee> Employees { get; set; } // Navigációs tulajdonság "sok" esetén } public class Employee { public int Id { get; set; } public string Name { get; set; } public int CompanyId { get; set; } // Külső kulcs public Company Company { get; set; } // Navigációs tulajdonság "egy" esetén } - Az adatbázis kontextusban a kapcsolatok konfigurálva vannak (néha az Entity Framework Core ezeket konvenció alapján felismeri).
public class ApplicationDbContext : DbContext { public DbSet<Company> Companies { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Egyértelmű kapcsolat meghatározása (nem mindig szükséges) modelBuilder.Entity<Company>() .HasMany(c => c.Employees) // Egy cégnek sok alkalmazottja van .WithOne(e => e.Company) // Egy alkalmazottnak egy cége van .HasForeignKey(e => e.CompanyId); // Külső kulcs az Employee táblában } }
ORM nélkül (kézzel):
- Adatok lekérése JOIN lekérdezésekkel.
// SQL lekérdezés példa // SELECT c.Name AS CompanyName, e.Name AS EmployeeName // FROM Companies c // JOIN Employees e ON c.Id = e.CompanyId; - Megfelelő osztályok létrehozása és az objektumok kézi összekapcsolása az adatok lekérése után.
public class Company { public string Name { get; set; } public List<Employee> Employees { get; set; } // Gyűjtemény a kapcsolódó objektumok tárolására } public class Employee { public string Name { get; set; } } // Objektumok létrehozásának példája az adatok lekérése után // 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" });