İ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 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.