İlişkilere giriş

Bu belge, EF Core'un ikisi arasındaki eşleme de dahil olmak üzere nesne modellerindeki ve ilişkisel veritabanlarındaki ilişkilerin gösterimine basit bir giriş sağlar.

Nesne modellerindeki ilişkiler

İlişki, iki varlığın birbiriyle ilişkisini tanımlar. Örneğin, bir blogdaki gönderileri modellerken, her gönderi yayımlandığı blogla ve blog bu blogda yayımlanan tüm gönderiler ile ilgilidir.

C# gibi nesne odaklı bir dilde blog ve gönderi genellikle iki sınıfla gösterilir: Blog ve Post. Örneğin:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }
}
public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }
}

Yukarıdaki sınıflarda, ve Post ile ilgili olduğunu Blog belirten hiçbir şey yoktur. Bu, yayımlandığı nesne modeline bir başvuru Post eklenerek nesne modeline Blog eklenebilir:

public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateOnly PublishedOn { get; set; }
    public bool Archived { get; set; }

    public Blog Blog { get; set; }
}

Benzer şekilde, aynı ilişkinin ters yönü her Blogbir nesne koleksiyonu Post olarak gösterilebilir:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}

Ve tersinePost, bu Blog bağlantı Blog Post EF Core'da "ilişki" olarak bilinir.

Önemli

Tek bir ilişki genellikle her iki yönde de geçirilebilir. Bu örnekte, bu özellik aracılığıyla Blog.Posts ile arasında Post Blog ve Post geri Blog özelliği aracılığıylaPost.Blog. Bu bir ilişki, iki değil.

İpucu

EF Core'da Blog.Posts ve Post.Blog özellikleri "gezinti" olarak adlandırılır.

İlişkisel veritabanlarındaki ilişkiler

İlişkisel veritabanları, yabancı anahtarları kullanan ilişkileri temsil eder. Örneğin, SQL Server veya Azure SQL kullanılarak ve Blog sınıflarımızı Post temsil etmek için aşağıdaki tablolar kullanılabilir:

CREATE TABLE [Posts] (
    [Id] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [PublishedOn] datetime2 NOT NULL,
    [Archived] bit NOT NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE);

CREATE TABLE [Blogs] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [SiteUri] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));

Bu ilişkisel modelde ve Blogs tablolarının her birine Posts "birincil anahtar" sütunu verilir. Birincil anahtarın değeri her gönderiyi veya blogu benzersiz olarak tanımlar. Ayrıca, tabloya Posts bir "yabancı anahtar" sütunu verilir. Birincil Blogs anahtar sütununa Id BlogId tablonun yabancı anahtar sütunu tarafından başvurulur Posts . Bu sütun ,sütunundaki herhangi bir değerin sütunundaki Id bir değerle eşleşmesi Posts gereken şekilde "kısıtlanmış"dırBlogs.BlogId Bu eşleşme, her gönderinin hangi blogla ilişkili olduğunu belirler. Örneğin, tablonun bir satırındaki BlogId Posts değer 7 ise, bu satırın temsil ettiği gönderi blogda birincil anahtar 7 ile yayımlanır.

EF Core'da ilişkileri eşleme

EF Core ilişki eşlemesi, ilişkisel veritabanında kullanılan birincil anahtar/yabancı anahtar gösterimini bir nesne modelinde kullanılan nesneler arasındaki başvurularla eşlemektir.

En temel anlamda, bu şunları içerir:

  • Her varlık türüne birincil anahtar özelliği ekleme.
  • Bir varlık türüne yabancı anahtar özelliği ekleme.
  • Tek bir ilişki yapılandırması oluşturmak için varlık türleri arasındaki başvuruları birincil ve yabancı anahtarlarla ilişkilendirme.

Bu eşleme yapıldıktan sonra EF, nesneler arasındaki başvurular değiştiğinde yabancı anahtar değerlerini gerektiği gibi değiştirir ve yabancı anahtar değerleri değiştiğinde nesneler arasındaki başvuruları gerektiği gibi değiştirir.

Not

Birincil anahtarlar, eşleme ilişkilerinden daha fazlası için kullanılır. Daha fazla bilgi için bkz . Anahtarlar .

Örneğin, yukarıda gösterilen varlık türleri birincil ve yabancı anahtar özellikleriyle güncelleştirilebilir:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}
public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

İpucu

Birincil ve yabancı anahtar özelliklerinin varlık türünün genel olarak görünür olması gerekmez. Ancak, özellikler gizlendiğinde bile, bunların EF modelinde hala var olduğunu bilmek önemlidir.

, ve öğesinin Blogyabancı anahtar özelliği birincil anahtar özelliğiPostPost.BlogId, varlık türleri (Blog.Posts ve Post.Blog) arasındaki başvurularla ("gezintiler") ilişkilendirilebilir. Blog.Id Bunun gibi basit bir ilişki oluşturulurken EF tarafından otomatik olarak yapılır, ancak yönteminiz DbContextgeçersiz kılınırken OnModelCreating açıkça belirtilebilir. Örneğin:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasMany(e => e.Posts)
        .WithOne(e => e.Blog)
        .HasForeignKey(e => e.BlogId)
        .HasPrincipalKey(e => e.Id);
}

Artık tüm bu özellikler ile Postarasında Blog tek bir ilişkinin temsili olarak birlikte tutarlı bir şekilde davranacaktır.

Daha fazla bilgi edinin

EF, bu ilişkilerin temsil edilebileceği ve yapılandırılabildiği birçok farklı yolla birçok farklı ilişki türünü destekler. Farklı ilişki türlerine yönelik örneklere atlamak için bkz:

EF'de yeniyseniz, yukarıdaki madde işareti noktalarında bağlantılı örnekleri denemek ilişkilerin nasıl çalıştığına ilişkin bir his edinmenin iyi bir yoludur.

İlişki eşlemesinde yer alan varlık türlerinin özelliklerini daha ayrıntılı incelemek için bkz:

EF modelleri üç mekanizmanın birleşimi kullanılarak oluşturulur: kurallar, eşleme öznitelikleri ve model oluşturucu API'si. Örneklerin çoğu model oluşturma API'sini gösterir. Diğer seçenekler hakkında daha fazla bilgi edinmek için bkz:

Önemli

Model oluşturma API'si, EF modelinin son gerçek kaynağıdır; her zaman kural tarafından bulunan veya eşleme öznitelikleri tarafından belirtilen yapılandırmadan önceliklidir. Aynı zamanda EF modelinin her yönünü yapılandırmak için tam uygunluğu olan tek mekanizmadır.

İlişkilerle ilgili diğer konular şunlardır:

İpucu

Kullanılan terminolojiyi anlamanıza yardımcı olmak için belgeleri okurken gerektiğinde ilişki terimleri sözlüğüne bakın.

İlişkileri kullanma

Modelde tanımlanan ilişkiler çeşitli şekillerde kullanılabilir. Örneğin: