Sobes.tech
Middle

Hoe implementeer je een 'een-op-veel' relatie in een database of in C#-code?

sobes.tech AI

Antwoord van AI

In de database:

  • Er wordt een tabel gemaakt voor "één" (de ouder) en een tabel voor "veel" (de kinderen).
  • Er wordt een buitenlandse sleutel toegevoegd aan de "veel" tabel die verwijst naar de primaire sleutel van de "één" tabel.
  • Voorbeeld: Tabellen Companies en Employees. In de tabel Employees is er een kolom CompanyId (buitenlandse sleutel) die verwijst naar Id (primaire sleutel) in de tabel Companies.

In C# code:

Met Entity Framework Core:

  • Er worden modelklassen gedefinieerd voor de ouder en de kinderen.
  • De ouderklasse bevat een collectie van kindobjecten.
  • De kindklasse bevat een verwijzing naar het ouderobject en de buitenlandse sleutel.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Navigatie-eigenschap voor "veel"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Buitenlandse sleutel
        public Company Company { get; set; } // Navigatie-eigenschap voor "één"
    }
    
  • In de databasecontext worden de relaties geconfigureerd (soms kan Entity Framework Core ze detecteren op basis van conventie).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Expliciete specificatie van de relatie (niet altijd nodig)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Een bedrijf heeft veel werknemers
                .WithOne(e => e.Company) // Een werknemer heeft één bedrijf
                .HasForeignKey(e => e.CompanyId); // Buitenlandse sleutel in de tabel Employee
        }
    }
    

Zonder ORM (handmatig):

  • Het ophalen van gegevens uit de database met JOIN-query's.
    // Voorbeeld SQL-query
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Het maken van de bijbehorende klassen en handmatig koppelen van objecten na het ophalen van gegevens.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Collectie voor het opslaan van gerelateerde objecten
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Voorbeeld van het maken van objecten na het ophalen van gegevens
    // 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" });