Aracılığıyla paylaş


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

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ı nullbelirtmek 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 Postarası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 .