Gölge ve Dizin Oluşturucu Özellikleri
Gölge özellikler, .NET varlık sınıfınızda tanımlanmayan ancak EF Core modelinde bu varlık türü için tanımlanan özelliklerdir. Bu özelliklerin değeri ve durumu yalnızca Değişiklik İzleyicisi'nde tutulur. Gölge özellikleri, veritabanında eşlenen varlık türlerinde gösterilmemesi gereken veriler olduğunda kullanışlıdır.
Dizin oluşturucu özellikleri, .NET varlık sınıfında bir dizin oluşturucu tarafından yedeklenen varlık türü özellikleridir. Bunlara .NET sınıf örneklerinde dizin oluşturucu kullanılarak erişilebilir. Ayrıca CLR sınıfını değiştirmeden varlık türüne ek özellikler eklemenize de olanak tanır.
Yabancı anahtar gölge özellikleri
Gölge özellikler çoğunlukla yabancı anahtar özellikleri için kullanılır ve burada kural tarafından yabancı anahtar özelliği bulunamadığında veya açıkça yapılandırıldığında kurala göre modele eklenirler. İlişki gezinti özellikleriyle temsil edilir, ancak veritabanında yabancı anahtar kısıtlaması tarafından zorlanır ve yabancı anahtar sütununun değeri ilgili gölge özelliğinde depolanır.
Özelliği adlandırılacaktır <navigation property name><principal key property name>
(adlandırma için asıl varlığa işaret eden bağımlı varlıkta gezinti kullanılır). Asıl anahtar özellik adı gezinti özelliğinin adıyla başlıyorsa, ad yalnızca olur <principal key property name>
. Bağımlı varlıkta gezinti özelliği yoksa, yerine <principal type name><principal key property name>
birincil veya alternatif anahtar özellik adıyla birleştirilmiş asıl tür adı kullanılır.
Örneğin, aşağıdaki kod listesi varlığa bir BlogId
gölge özelliğin tanıtılmasıyla Post
sonuçlanır:
internal class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
// Since there is no CLR property which holds the foreign
// key for this relationship, a shadow property is created.
public Blog Blog { get; set; }
}
Gölge özellikleri yapılandırma
Fluent API'sini kullanarak gölge özellikleri yapılandırabilirsiniz. dize aşırı yüklemesini Property<TProperty>(String)çağırdıktan sonra, diğer özellikler için yapabileceğiniz yapılandırma çağrılarından herhangi birini zincirleyebilirsiniz. Aşağıdaki örnekte adlı Blog
LastUpdated
CLR özelliği olmadığından bir gölge özellik oluşturulur:
internal class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property<DateTime>("LastUpdated");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
Yöntemine Property
sağlanan ad, mevcut bir özelliğin adıyla (bir gölge özellik veya varlık sınıfında tanımlanan bir ad) eşleşiyorsa, kod yeni bir gölge özellik eklemek yerine var olan özelliği yapılandıracaktır.
Gölge özelliklere erişme
Gölge özellik değerleri API aracılığıyla ChangeTracker
alınabilir ve değiştirilebilir:
context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
Statik yöntem aracılığıyla LINQ sorgularında gölge özelliklere EF.Property
başvurulabilir:
var blogs = context.Blogs
.OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));
Döndürülen varlıklar değişiklik izleyicisi tarafından izlenmediği için gölge özelliklere izleme yok sorgusundan sonra erişilemez.
Dizin oluşturucu özelliklerini yapılandırma
Dizin oluşturucu özelliklerini yapılandırmak için Fluent API'sini kullanabilirsiniz. yöntemini IndexerProperty
çağırdıktan sonra, diğer özellikler için yapabileceğiniz yapılandırma çağrılarından herhangi birini zincirleyebilirsiniz. Aşağıdaki örnekte, Blog
tanımlanmış bir dizin oluşturucu vardır ve dizin oluşturucu özelliği oluşturmak için kullanılacaktır.
internal class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().IndexerProperty<DateTime>("LastUpdated");
}
}
public class Blog
{
private readonly Dictionary<string, object> _data = new Dictionary<string, object>();
public int BlogId { get; set; }
public object this[string key]
{
get => _data[key];
set => _data[key] = value;
}
}
Yöntemine IndexerProperty
sağlanan ad mevcut bir dizin oluşturucu özelliğinin adıyla eşleşiyorsa, kod bu mevcut özelliği yapılandıracaktır. Varlık türü, varlık sınıfındaki bir özellik tarafından desteklenen bir özelliğe sahipse, dizin oluşturucu özelliklerine yalnızca dizin oluşturucu aracılığıyla erişilmesi gerektiğinden bir özel durum oluşturulur.
Dizin oluşturucu özelliklerine LINQ sorgularında yukarıda gösterildiği gibi statik yöntem aracılığıyla EF.Property
veya CLR dizin oluşturucu özelliği kullanılarak başvurulabilir.
Özellik paketi varlık türleri
Yalnızca dizin oluşturucu özellikleri içeren varlık türleri, özellik paketi varlık türleri olarak bilinir. Bu varlık türlerinin gölge özellikleri yoktur ve EF bunun yerine dizin oluşturucu özellikleri oluşturur. Şu anda yalnızca Dictionary<string, object>
özellik paketi varlık türü olarak desteklenmektedir. Benzersiz bir ada sahip paylaşılan tür varlık türü olarak yapılandırılması ve buna karşılık gelen DbSet
özelliğin bir Set
çağrı kullanılarak uygulanması gerekir.
internal class MyContext : DbContext
{
public DbSet<Dictionary<string, object>> Blogs => Set<Dictionary<string, object>>("Blog");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.SharedTypeEntity<Dictionary<string, object>>(
"Blog", bb =>
{
bb.Property<int>("BlogId");
bb.Property<string>("Url");
bb.Property<DateTime>("LastUpdated");
});
}
}
Özellik paketi varlık türleri, sahip olunan varlık türü de dahil olmak üzere normal bir varlık türünün kullanıldığı her yerde kullanılabilir. Ancak, belirli sınırlamaları vardır: