Bekerja dengan proksi
Saat membuat instans jenis entitas POCO, Entity Framework sering membuat instans dari jenis turunan yang dihasilkan secara dinamis yang bertindak sebagai proksi untuk entitas. Proksi ini mengambil alih beberapa properti virtual entitas untuk menyisipkan kait untuk melakukan tindakan secara otomatis saat properti diakses. Misalnya, mekanisme ini digunakan untuk mendukung pemuatan hubungan yang malas. Teknik yang ditunjukkan dalam topik ini berlaku sama untuk model yang dibuat dengan Perancang EF dan Code First.
Menonaktifkan pembuatan proksi
Terkadang berguna untuk mencegah Kerangka Kerja Entitas membuat instans proksi. Misalnya, menserialisasikan instans non-proksi jauh lebih mudah daripada menserialisasikan instans proksi. Pembuatan proksi dapat dimatikan dengan menghapus ProxyCreationEnabled
bendera. Satu tempat yang dapat Anda lakukan ini adalah dalam konstruktor konteks Anda. Contohnya:
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.ProxyCreationEnabled = false;
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Perhatikan bahwa EF tidak akan membuat proksi untuk jenis di mana tidak ada yang dapat dilakukan proksi. Ini berarti Anda juga dapat menghindari proksi dengan memiliki jenis yang disegel dan/atau tidak memiliki properti virtual.
Membuat instans proksi secara eksplisit
Instans proksi tidak akan dibuat jika Anda membuat instans entitas menggunakan operator baru. Ini mungkin tidak menjadi masalah, tetapi jika Anda perlu membuat instans proksi (misalnya, sehingga pemuatan malas atau pelacakan perubahan proksi akan berfungsi) maka Anda dapat melakukannya menggunakan Create
metode DbSet
. Contohnya:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Create();
}
Versi Create
generik dapat digunakan jika Anda ingin membuat instans jenis entitas turunan. Contohnya:
using (var context = new BloggingContext())
{
var admin = context.Users.Create<Administrator>();
}
Perhatikan bahwa Create
metode tidak menambahkan atau melampirkan entitas yang dibuat ke konteks.
Perhatikan bahwa Create
metode hanya akan membuat instans jenis entitas itu sendiri jika membuat jenis proksi untuk entitas tidak akan memiliki nilai karena tidak akan melakukan apa pun. Misalnya, jika jenis entitas disegel dan/atau tidak memiliki properti virtual maka Create
hanya akan membuat instans jenis entitas.
Mendapatkan jenis entitas aktual dari jenis proksi
Jenis proksi memiliki nama yang terlihat seperti ini:
System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
Anda dapat menemukan jenis entitas untuk jenis proksi ini menggunakan GetObjectType
metode dari ObjectContext
. Contohnya:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());
}
Perhatikan bahwa jika jenis yang diteruskan ke GetObjectType
adalah instans jenis entitas yang bukan jenis proksi, maka jenis entitas masih dikembalikan. Ini berarti Anda selalu dapat menggunakan metode ini untuk mendapatkan jenis entitas aktual tanpa pemeriksaan lain untuk melihat apakah jenisnya adalah jenis proksi atau tidak.