共用方式為


使用 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 變更追蹤能夠運作),則可以使用 CreateDbSet 方法。 例如:

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 類型。