0Pricing
C# Academy · Ders

İlişkiler: Bire Çok ve Çoka Çok

Gezinme özellikleri ve Fluent API ile bire çok ve çoka çok ilişkileri modelleyin ve sorgulayın.

İlişkiler: Bire Çok ve Çoka Çok, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

EF Core'da İlişkiler

EF Core, varlıklar arasındaki üç ilişki türünü modeller: bire bir, bire çok ve çoka çok. Her biri gezinme özellikleriyle ifade edilir ve isteğe bağlı olarak Akıcı Programlama Arayüzüyle yapılandırılır.

Bire Çok: Varlıkların Kurulumu

Bir Blog'un birçok Post'u vardır. Bağımlı varlık (Post) yabancı anahtarı taşır. Her iki taraftaki gezinme özellikleri, ilişkinin her iki yönde de izlenmesini sağlar.

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public ICollection<Post> Posts { get; set; } = new List<Post>();
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public int BlogId { get; set; }        // FK
    public Blog Blog { get; set; } = null!; // nav property
}

Akıcı Programlama Arayüzü: Bire Çok

EF Core ilişkiyi kurallar aracılığıyla çıkarır; ancak açıklık sağlamak ve basamaklı silme davranışını ayarlamak için Akıcı Programlama Arayüzüyle açıkça yapılandırabilirsiniz.

protected override void OnModelCreating(ModelBuilder mb)
{
    mb.Entity<Blog>()
      .HasMany(b => b.Posts)
      .WithOne(p => p.Blog)
      .HasForeignKey(p => p.BlogId)
      .OnDelete(DeleteBehavior.Cascade);
}

Include ile Sorgulama (Önden Yükleme)

İlişkili verileri aynı sorguda yüklemek için Include kullanın. Gezinme grafiğinde daha derine inmek için ThenInclude kullanın.

// Load blog with all its posts
var blog = await _db.Blogs
    .Include(b => b.Posts)
    .FirstOrDefaultAsync(b => b.Id == 1);

// Load posts with their comments too
var blogs = await _db.Blogs
    .Include(b => b.Posts)
        .ThenInclude(p => p.Comments)
    .ToListAsync();

Birleştirme Varlığı Olmadan Çoka Çok İlişki

EF Core 5 ve sonraki sürümler, açık bir birleştirme varlığı olmadan çoka çok ilişkileri destekler. Birleştirme tablosunu varlık türlerinin adlarını kullanarak otomatik olarak oluşturur.

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public ICollection<Course> Courses { get; set; } = new List<Course>();
}

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public ICollection<Student> Students { get; set; } = new List<Student>();
}
// EF creates StudentCourse join table automatically

Birleştirme Varlığıyla Çoka Çok İlişki

Birleştirme tablosunda ek sütunlar gerektiğinde (ör. kayıt tarihi ve not), bileşik birincil anahtara sahip açık bir birleştirme varlığı oluşturun.

public class Enrollment
{
    public int StudentId { get; set; }
    public Student Student { get; set; } = null!;
    public int CourseId { get; set; }
    public Course Course { get; set; } = null!;
    public DateTime EnrolledAt { get; set; }
    public decimal? Grade { get; set; }
}

// Fluent API config:
mb.Entity<Enrollment>().HasKey(e => new { e.StudentId, e.CourseId });
mb.Entity<Enrollment>().HasOne(e => e.Student).WithMany(s => s.Enrollments);
mb.Entity<Enrollment>().HasOne(e => e.Course).WithMany(c => c.Enrollments);

İlişkili Verileri Ekleme

SaveChangesAsync çağrısını yapmadan önce ilişkili varlıkları üst varlığın koleksiyonuna ekleyin. EF Core, FK değerlerini otomatik olarak yönetir.

var blog = new Blog { Name = "Dev Notes" };
blog.Posts.Add(new Post { Title = "Hello EF Core" });
blog.Posts.Add(new Post { Title = "Migrations Deep Dive" });

_db.Blogs.Add(blog);
await _db.SaveChangesAsync();
// Inserts Blog + 2 Posts with correct BlogId FK

İlişkili Verilere Göre Filtreleme

LINQ içinde gezinme özelliklerine göre filtreleme yapabilirsiniz. EF Core bunları otomatik olarak SQL JOIN işlemlerine çevirir.

// Blogs that have at least one published post
var popularBlogs = await _db.Blogs
    .Where(b => b.Posts.Any(p => p.IsPublished))
    .Select(b => new { b.Name, PostCount = b.Posts.Count(p => p.IsPublished) })
    .OrderByDescending(b => b.PostCount)
    .ToListAsync();

Basamaklı Silme

DeleteBehavior.Cascade kullanıldığında, asıl varlığın (Blog) silinmesi tüm bağımlı varlıkları (gönderileri) otomatik olarak siler. Diğer seçenekler: SetNull, Restrict, NoAction.

// Delete a blog and all its posts
var blog = await _db.Blogs.FindAsync(1);
_db.Blogs.Remove(blog!);
await _db.SaveChangesAsync();
// Cascade: all Posts with BlogId=1 are also deleted

Değer Nesneleri için Sahip Olunan Varlıklar

Sahip olunan varlık türleri, değer nesneleri (ör. Address) için çok uygundur. Sahipleriyle aynı tabloda depolanır ve bağımsız bir kimlikleri yoktur.

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public Address ShippingAddress { get; set; } = new();
}

public class Address
{
    public string Street { get; set; } = "";
    public string City { get; set; } = "";
    public string Country { get; set; } = "";
}

// Fluent API:
mb.Entity<Customer>().OwnsOne(c => c.ShippingAddress);

Gerçek Hayattan: Satır Kalemleri Olan Sipariş

Eksiksiz bir e-ticaret kalıbı: Birçok OrderLines içeren bir Sipariş (asıl varlık); her OrderLines öğesi bir Product'a başvurur.

var order = await _db.Orders
    .Include(o => o.Lines)
        .ThenInclude(l => l.Product)
    .FirstOrDefaultAsync(o => o.Id == orderId);

if (order is null) return Results.NotFound();

var summary = new
{
    OrderId = order.Id,
    Total   = order.Lines.Sum(l => l.Quantity * l.Product.Price),
    Items   = order.Lines.Select(l => new
    {
        l.Product.Name,
        l.Quantity,
        LineTotal = l.Quantity * l.Product.Price
    })
};
return Results.Ok(summary);

Hızlı Kontrol

EF Core, açık bir birleştirme varlığı olmadan birleştirme tablosunu ne zaman otomatik olarak oluşturur?

Özet: EF Core'da İlişkiler

Önemli noktalar:

  • Bire çok: FK bağımlı varlıktadır; her iki tarafta gezinme özelliği bulunur; yüklemek için Include kullanılır
  • Çoka çok (basit): İki ICollection gezinme özelliği — EF Core birleştirme tablosunu otomatik oluşturur
  • Çoka çok (ek verili): Bileşik PK içeren açık bir birleştirme varlığı
  • Basamaklı silme, asıl varlık kaldırıldığında bağımlı varlıklara ne olacağını belirler
  • Sahip olunan varlıklar, değer nesnelerini sahipleriyle aynı tabloda modeller

Sıkça Sorulan Sorular

“İlişkiler: Bire Çok ve Çoka Çok” dersi ücretsiz mi?

Evet — “İlişkiler: Bire Çok ve Çoka Çok” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“İlişkiler: Bire Çok ve Çoka Çok” dersinde ne öğreneceğim?

Gezinme özellikleri ve Fluent API ile bire çok ve çoka çok ilişkileri modelleyin ve sorgulayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“İlişkiler: Bire Çok ve Çoka Çok” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. DbContext ve DbSet Temelleri
  2. Geçişler ve Şema Yönetimi
  3. EF Core ile CRUD İşlemleri
  4. İlişkiler: Bire Çok ve Çoka Çok
← C# Academy Sayfasına Dön