Sobes.tech
Middle

Veritabanında veya C# kodunda 'birden çoğa' ilişki nasıl uygulanır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Veritabanında:

  • "Bir" (ebeveyn) ve "birçok" (çocuklar) için tablolar oluşturulur.
  • "Çok" tablosuna, "bir" tablosunun birincil anahtarına referans veren bir dış anahtar eklenir.
  • Örnek: Companies ve Employees tabloları. Employees tablosunda, CompanyId (dış anahtar) sütunu, Companies tablosundaki Id (birincil anahtar) sütununa referans verir.

C# kodunda:

Entity Framework Core kullanılarak:

  • Ebeveyn ve çocuklar için model sınıfları tanımlanır.
  • Ebeveyn sınıfı, çocuk nesnelerinin koleksiyonunu içerir.
  • Çocuk sınıfı, ebeveyn nesnesine referans ve dış anahtar içerir.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // "Çok" için gezinme özelliği
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Dış anahtar
        public Company Company { get; set; } // "Bir" için gezinme özelliği
    }
    
  • Veritabanı bağlamında ilişkiler yapılandırılır (bazen Entity Framework Core bunları varsayılan olarak tanıyabilir).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Açıkça ilişki belirtimi (her zaman gerekli değildir)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Şirketin birçok çalışanı var
                .WithOne(e => e.Company) // Çalışanın bir şirketi var
                .HasForeignKey(e => e.CompanyId); // Employee tablosundaki dış anahtar
        }
    }
    

ORM olmadan (el ile):

  • JOIN sorguları kullanılarak veritabanından veri alınır.
    // SQL sorgusu örneği
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Uygun sınıflar oluşturulur ve veriler alındıktan sonra nesneler manuel olarak bağlanır.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Bağlantılı nesneleri saklamak için koleksiyon
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Veriler alındıktan sonra nesne oluşturma örneği
    // 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" });