Aracılığıyla paylaş


İ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 Blog ile ilgili olduğunu Post 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 Postbir nesne koleksiyonu Blog olarak gösterilebilir:

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

    public ICollection<Post> Posts { get; }
}

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

Önemli

tek ilişki genellikle her iki yönde de izlenebilir. Bu örnekte, bu özellik aracılığıyla Blog ile arasında PostBlog.Posts 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 Post sınıflarımızı Blog 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 Posts tablolarının her birine Blogs "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 IdBlogId tablonun yabancı anahtar sütunu tarafından başvurulur Posts . Bu sütun ,sütunundaki herhangi bir değerin sütunundaki BlogId bir değerle eşleşmesi Postsgereken şekilde "kısıtlanmış"dırId.Blogs Bu eşleşme, her gönderinin hangi blogla ilişkili olduğunu belirler. Örneğin, tablonun bir satırındaki BlogIdPosts 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ğiBlog.IdPost, varlık türleri (Post.BlogId ve Blog.Posts) arasındaki başvurularla ("gezintiler") ilişkilendirilebilir. Post.Blog Bunun gibi basit bir ilişki oluşturulurken EF tarafından otomatik olarak yapılır, ancak yönteminiz OnModelCreatinggeçersiz kılınırken DbContext 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 Blogarasında Post 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:

  • SaveChangesAsync işlemleri.
  • Sahip olunan varlık türleri , iki tür arasında burada açıklanan "normal" ilişkilerden daha güçlü bir bağlantı anlamına gelen özel bir "sahiplik" ilişkisi türü kullanır. Burada normal ilişkiler için açıklanan kavramların çoğu sahip olunan ilişkilere taşınır. Ancak, sahip olunan ilişkilerin kendi özel davranışları da vardı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:

  • İlişkiler, ilgili verileri sorgulamak için üç yoldan herhangi birini kullanarak kullanılabilir:
    • kullanarak Includebir LINQ sorgusunun bir parçası olarak hevesle.
    • Yavaş yükleme proxy'leri veya proxy'ler olmadan tembel yükleme kullanarak.
    • Load kullanmaLoadAsync.
  • İlişkiler, PK değerlerinin FK değerleriyle eşleşmesi yoluyla veri tohumlamada kullanılabilir.
  • İlişkiler, varlıkların grafiklerini izlemek için kullanılabilir. Ardından, değişiklik izleyicisi tarafından aşağıdakiler için ilişkiler kullanılır: