İlişkiler için eşleme öznitelikleri (diğer adıyla veri ek açıklamaları)
Eşleme öznitelikleri, model oluşturma kuralları tarafından bulunan yapılandırmayı değiştirmek veya geçersiz kılmak için kullanılır. Eşleme öznitelikleri tarafından gerçekleştirilen yapılandırma, içinde OnModelCreating
kullanılan model derleme API'si tarafından geçersiz kılınabilir.
Önemli
Bu belge yalnızca ilişki yapılandırması bağlamında eşleme özniteliklerini kapsar. Eşleme özniteliklerinin diğer kullanımları, daha geniş modelleme belgelerinin ilgili bölümlerinde ele alınmıştır.
İpucu
Aşağıdaki kod MappingAttributes.cs bulunabilir.
Eşleme özniteliklerinin alınacağı yer
Birçok eşleme özniteliği System.ComponentModel.DataAnnotations ve System.ComponentModel.DataAnnotations.Schema ad alanından gelir. Bu ad alanları içindeki öznitelikler desteklenen tüm .NET sürümlerinde temel çerçevenin bir parçası olarak bulunur ve bu nedenle ek NuGet paketlerinin yüklenmesi gerekmez. Bu eşleme öznitelikleri genellikle "veri ek açıklamaları" olarak adlandırılır ve EF Core, EF6, ASP.NET Core MVC gibi çeşitli çerçeveler tarafından kullanılır. Bunlar doğrulama için de kullanılır.
Birçok teknolojide ve hem eşleme hem de doğrulama için veri ek açıklamalarının kullanılması, teknolojiler arasında semantik farklılıklarına yol açmıştır. EF Core için tasarlanan tüm yeni eşleme öznitelikleri artık EF Core'a özgü olduğundan anlamlarını koruyarak basit ve net bir şekilde kullanır. Bu öznitelikler Microsoft.EntityFrameworkCore.Abstractions NuGet paketinde bulunur. Bu paket, ana Microsoft.EntityFrameworkCore paketi veya ilişkili veritabanı sağlayıcısı paketlerinden biri kullanıldığında bağımlılık olarak eklenir. Ancak Soyutlamalar paketi, tüm EF Core ve bağımlılıklarını getirmeden doğrudan uygulama kodu tarafından başvurulabilen basit bir pakettir.
RequiredAttribute
RequiredAttribute özelliğinin olamayacağını null
belirtmek için bir özelliğe uygulanır. İlişkiler bağlamında, [Required]
genellikle yabancı anahtar özelliğinde kullanılır. Bunu yaptığınızda yabancı anahtar null atanamaz hale gelir ve böylece ilişki gerekli hale gelir. Örneğin, aşağıdaki türlerle Post.BlogId
özelliği null atanamaz hale gelir ve ilişki gerekli hale gelir.
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public string BlogId { get; set; }
public Blog Blog { get; init; }
}
Not
C# null atanabilir başvuru türleri kullanılırken, BlogId
bu örnekteki özellik zaten null atanamaz, yani özniteliğin [Required]
hiçbir etkisi olmaz.
[Required]
bağımlı gezintiye yerleştirildiğinde aynı etkiyi gösterir. Yani, yabancı anahtarı null atanamaz hale getirmek ve böylece ilişkiyi gerekli hale getirmek. Örneğin:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogId { get; set; }
[Required]
public Blog Blog { get; init; }
}
Bağımlı gezintide bulunursa [Required]
ve yabancı anahtar özelliği gölge durumdaysa, gölge özellik null atanamaz hale gelir ve böylece ilişki gerekli hale gelir. Örneğin:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public Blog Blog { get; init; }
}
Not
bir [Required]
ilişkinin asıl gezinti tarafında kullanılmasının hiçbir etkisi yoktur.
Yabancı AnahtarAttribute
ForeignKeyAttribute , bir yabancı anahtar özelliğini gezintilerine bağlamak için kullanılır. [ForeignKey]
, bağımlı gezinti adıyla yabancı anahtar özelliğine yerleştirilebilir. Örneğin:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey(nameof(Blog))]
public string BlogKey { get; set; }
public Blog Blog { get; init; }
}
Alternatif olarak, [ForeignKey]
yabancı anahtar olarak kullanılacak özelliğin adıyla bağımlı veya asıl gezintiye yerleştirilebilir. Örneğin:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogKey { get; set; }
[ForeignKey(nameof(BlogKey))]
public Blog Blog { get; init; }
}
Gezintiye yerleştirildiğinde [ForeignKey]
ve sağlanan ad herhangi bir özellik adıyla eşleşmediğinde, yabancı anahtar görevi görmesi için bu ada sahip bir gölge özellik oluşturulur. Örneğin:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey("BlogKey")]
public Blog Blog { get; init; }
}
InversePropertyAttribute
InversePropertyAttribute , bir gezintiyi tersiyle bağlamak için kullanılır. Örneğin, aşağıdaki varlık türlerinde ve Post
arasında Blog
iki ilişki vardır. Herhangi bir yapılandırma olmadan, EF kuralları iki tür arasındaki hangi gezintilerin eşleştirileceğini belirleyemez. Eşleştirilmiş gezintilerden birine eklemek [InverseProperty]
bu belirsizliği çözer ve EF'in modeli oluşturmasına olanak tanır.
public class Blog
{
public int Id { get; set; }
[InverseProperty("Blog")]
public List<Post> Posts { get; } = new();
public int FeaturedPostId { get; set; }
public Post FeaturedPost { get; set; }
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; init; }
}
Önemli
[InverseProperty]
yalnızca aynı türler arasında birden fazla ilişki olduğunda gereklidir. Tek bir ilişkiyle, iki gezinti otomatik olarak eşleştirilir.
DeleteBehaviorAttribute
Kural gereği EF, isteğe bağlı ilişkiler için ve ClientSetNull
DeleteBehavior gerekli ilişkiler Cascade
için davranışını kullanır. Bu, öğesini ilişkinin DeleteBehaviorAttribute gezintilerinden birine yerleştirerek değiştirilebilir. Örneğin:
public class Blog
{
public int Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
[DeleteBehavior(DeleteBehavior.Restrict)]
public Blog Blog { get; init; }
}
Basamaklı davranışlar hakkında daha fazla bilgi için bkz . Art arda silme .