使用 Proxy
建立 POCO 實體類型的實例時,Entity Framework 通常會建立動態產生的衍生型別實例,做為實體的 Proxy。 此 Proxy 會覆寫實體的某些虛擬屬性,以在存取 屬性時自動插入執行動作的勾點。 例如,這個機制可用來支援延遲載入關聯性。 本主題所示範的技巧同樣適用於使用 Code First 和 EF 設計工具所建立的模型。
停用 Proxy 建立
有時候,防止 Entity Framework 建立 Proxy 實例很有用。 例如,序列化非 Proxy 實例比序列化 Proxy 實例要容易得多。 清除旗標即可關閉 ProxyCreationEnabled
Proxy 建立。 您可以在內容建構函式中執行此動作的其中一個位置。 例如:
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.ProxyCreationEnabled = false;
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
請注意,EF 不會為 Proxy 沒有作用的類型建立 Proxy。 這表示您也可以藉由具有密封和/或沒有虛擬屬性的類型來避免 Proxy。
明確建立 Proxy 的實例
如果您使用新的運算子建立實體的實例,將不會建立 Proxy 實例。 這可能不是問題,但如果您需要建立 Proxy 實例(例如,讓延遲載入或 Proxy 變更追蹤能夠運作),則可以使用 Create
的 DbSet
方法。 例如:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Create();
}
如果您想要建立衍生實體類型的實例,可以使用 的泛型版本 Create
。 例如:
using (var context = new BloggingContext())
{
var admin = context.Users.Create<Administrator>();
}
請注意, Create
方法不會將已建立的實體新增或附加至內容。
請注意, Create
如果為實體建立 Proxy 類型,則方法只會建立實體類型的實例,因為不會執行任何動作。 例如,如果實體類型是密封的,且/或沒有虛擬屬性,則 Create
只會建立實體類型的實例。
從 Proxy 類型取得實際的實體類型
Proxy 類型的名稱看起來如下:
System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
您可以使用 的 ObjectContext
方法,找到此 Proxy 類型的實體類型 GetObjectType
。 例如:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());
}
請注意,如果傳遞至 GetObjectType
的類型是實體類型的實例,且該類型不是 Proxy 類型,則仍會傳回實體的類型。 這表示您一律可以使用此方法來取得實際的實體類型,而不需要任何其他檢查,即可查看類型是否為 Proxy 類型。