Proxy'lerle çalışma
POCO varlık türlerinin örnekleri oluşturulurken Entity Framework genellikle varlık için ara sunucu işlevi gören dinamik olarak oluşturulmuş türetilmiş bir türün örneklerini oluşturur. Bu proxy, özelliğe erişildiğinde eylemleri otomatik olarak gerçekleştirmek için kanca eklemek üzere varlığın bazı sanal özelliklerini geçersiz kılar. Örneğin, bu mekanizma ilişkilerin yavaş yüklenmesini desteklemek için kullanılır. Bu konu başlığında gösterilen teknikler, gerek Code First gerekse EF Designer ile oluşturulan modellere için geçerlidir.
Ara sunucu oluşturmayı devre dışı bırakma
Bazen Entity Framework'ün ara sunucu örnekleri oluşturmasını engellemek yararlı olabilir. Örneğin, ara sunucu olmayan örnekleri seri hale getirme, proxy örneklerini seri hale getirmekten çok daha kolaydır. Proxy oluşturma, bayrağı temizlenerek ProxyCreationEnabled
kapatılabilir. Bunu yapabileceğiniz bir yer, bağlamınızın oluşturucusundadır. Örnek:
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.ProxyCreationEnabled = false;
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
EF'nin, ara sunucu için hiçbir şey yapılmayan türler için proxy oluşturmayacağını unutmayın. Bu, korumalı ve/veya sanal özellikleri olmayan türlere sahip olarak proxy'lerden de kaçınabileceğiniz anlamına gelir.
Açıkça bir ara sunucu örneği oluşturma
Yeni işlecini kullanarak bir varlığın örneğini oluşturursanız ara sunucu örneği oluşturulmaz. Bu bir sorun olmayabilir, ancak bir ara sunucu örneği oluşturmanız gerekiyorsa (örneğin, gecikmeli yükleme veya ara sunucu değişiklik izlemesinin çalışması için) yöntemini kullanarak Create
DbSet
bunu yapabilirsiniz. Örnek:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Create();
}
Türetilmiş varlık türünün bir örneğini oluşturmak istiyorsanız genel sürümü Create
kullanılabilir. Örnek:
using (var context = new BloggingContext())
{
var admin = context.Users.Create<Administrator>();
}
yönteminin Create
oluşturulan varlığı bağlama eklemediğini veya eklemediğini unutmayın.
Create
Varlık için bir ara sunucu türü oluşturmanın hiçbir değeri olmayacağı için hiçbir şey yapmaması durumunda yöntemin varlık türünün yalnızca bir örneğini oluşturacağını unutmayın. Örneğin, varlık türü korumalıysa ve/veya sanal özellikleri Create
yoksa yalnızca varlık türünün bir örneğini oluşturur.
Bir ara sunucu türünden gerçek varlık türünü alma
Ara sunucu türleri aşağıdakine benzer adlara sahiptir:
System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
yöntemini kullanarak GetObjectType
ObjectContext
bu proxy türü için varlık türünü bulabilirsiniz. Örnek:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());
}
Geçirilen GetObjectType
tür, ara sunucu türü olmayan bir varlık türünün örneğiyse varlığın türünün döndürülmeye devam ettiğini unutmayın. Bu, türün ara sunucu türü olup olmadığını denetlemek için başka bir denetim yapmadan gerçek varlık türünü almak için her zaman bu yöntemi kullanabileceğiniz anlamına gelir.