İ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 Blog
bir 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 Blog
yabancı anahtar özelliği birincil anahtar özelliğiPost
Post.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 DbContext
geç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 Post
arası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:
- Tek bir varlığın herhangi bir sayıda diğer varlıkla ilişkilendirildiği bire çok ilişkiler.
- Tek bir varlığın başka bir tek varlıkla ilişkilendirildiği bire bir ilişkiler.
- Çoka çok ilişkileri, herhangi bir sayıda varlığın herhangi bir sayıda diğer varlıkla ilişkilendirildiği ilişkilerdir.
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:
- yabancı anahtarların veritabanına nasıl eşlendiğine ilişkin bilgileri kapsayan ilişkilerde yabancı anahtarlar ve asıl anahtarlar.
- İlişkinin nesne odaklı bir görünümünü sağlamak için gezintilerin yabancı bir anahtar üzerinde nasıl katmanlandığına ilişkin ilişki gezintileri.
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:
- Varlık türlerini, özelliklerini ve türler arasındaki ilişkileri keşfeden ilişki kuralları.
- İlişki yapılandırmasının bazı yönleri için model oluşturma API'sine alternatif olarak kullanılabilen ilişki eşleme öznitelikleri.
Ö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:
- İlişkili varlıkların çağrıldığında veya
SaveChangesAsync
çağrıldığındaSaveChanges
nasıl otomatik olarak silinebileceğini açıklayan art arda silme 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
Include
bir LINQ sorgusunun bir parçası olarak hevesle. - Yavaş yükleme proxy'leri veya proxy'ler olmadan tembel yükleme kullanarak.
- veya
LoadAsync
yöntemlerini açıkça kullanmaLoad
.
- kullanarak
- İ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:
- İlişkilerdeki değişiklikleri algılama ve düzeltme gerçekleştirme
- veya ile
SaveChanges
veritabanına yabancı anahtar güncelleştirmeleri göndermeSaveChangesAsync