Sobes.tech
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 és Employees táblák. Az Employees táblában van egy CompanyId (külső kulcs) oszlop, amely a Companies tábla Id (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" });