Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 OnModelCreatingkullanı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.
Öznitelik eşleme bilgileri nereden alınır?
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 yalnızca EF Core'a özgüdür, bu nedenle anlamları ve kullanım biçimleri basit ve nettir. 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.
GerekliÖznitelik
RequiredAttribute bir özelliğe uygulanarak, bu özelliğin null olamayacağı belirtilir. İ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 yapılabilir başvuru türleri kullanılırken, BlogId bu örnekteki özellik zaten null yapılamaz, yani [Required] özniteliğinin 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 [Required] bulunursa ve yabancı anahtar özelliği gölge durumdaysa, bu gölge özellik null olamaz hale gelir ve bu da ilişkiyi gerekli kılar. Ö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]'in ilişkinin ana gezinme tarafında kullanılmasının hiçbir etkisi yoktur.
Yabancı Anahtar Özniteliği
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; }
}
Gezinti üzerinde [ForeignKey] yerleştirildiğinde ve sağlanan ad herhangi bir özellik adıyla eşleşmediğinde, yabancı anahtar olarak işlev görmek üzere bu adla 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 navigasyonu tersiyle bağlamak için kullanılır. Örneğin, aşağıdaki varlık türlerinde, Blog ile Post arasında 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 ClientSetNullDeleteBehavior'ü ve gerekli ilişkiler için Cascade davranışını kullanır. Bu, DeleteBehaviorAttribute öğesini ilişki 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 Basamaklı silme bölümüne bakın.