2016-11-15 106 views
8

從我讀過的內容來看,設置ProxyCreationEnabled = false將防止更改跟蹤和延遲加載。不過,我不清楚跟蹤涵蓋哪些變化。禁用實體框架代理創建

如果我禁用它並從數據庫中獲取實體,對其進行更改並提交,那麼這些更改將被保存。我還能夠從ChangeTracker獲得修改的條目:

ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList() 

這應該是可能的,當我禁用代理創建?我想禁用它,但我想清楚我禁用的內容。

回答

5

更改跟蹤和代理創建是兩種不同的情況。如果您需要禁用更改跟蹤,那麼您必須按照如下所示進行。

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
     this.Configuration.AutoDetectChangesEnabled = false; 
    } 
} 

然後你不能這樣做ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList()

如果您需要禁用代理創建,那麼您必須在上下文的構造函數上執行該操作,如下所示。

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

代理創建機制用於支持延遲加載關係。 EF不會爲代理沒有任何內容的類型創建代理。換句話說,如果您的POCO類中沒有virtual屬性,那麼您無論是否禁用它都沒有任何影響。

如果您正在序列化您的實體,請考慮關閉代理和延遲加載,因爲反序列化代理可能會非常棘手。

你可以閱讀更多關於它在這裏:Entity Framework Working with Proxies

9

我可以證實,在EF設置ProxyCreationEnabled以虛假不影響變化跟蹤。你真的好奇我這個問題,因爲我認爲我知道答案,但要確認我創建了一個快速測試案例。

見下文表示一個有效的方案示例代碼:

namespace EFCTTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var context = new MyContext(); 
      context.Tests.First().Test = "Edited"; 

      var models = context.ChangeTracker.Entries<TestModel>().Where(x => x.State == EntityState.Modified).ToList(); 
      foreach(var model in models) 
       Console.WriteLine($"From {model.OriginalValues["Test"]} to {model.CurrentValues["Test"]}"); 

      Console.ReadLine(); 
     } 
    } 

    public class MyContext : DbContext 
    { 
     public MyContext() 
     { 
      Configuration.ProxyCreationEnabled = false; 
     } 

     public DbSet<TestModel> Tests { get; set; } 
    } 

    public class TestModel 
    { 
     public int Id { get; set; } 
     public string Test { get; set; } 
    } 
} 

,禁用代理生成應該影響的唯一的事情是EF的延遲加載功能,當您使用virtual導航屬性到另一個模型。變更追蹤器是獨立的,並從底層ObjectContext本身開始工作。

要獲取與更改跟蹤相關的完整答案,可能值得注意的是,AutoDetectChangesEnabled似乎是唯一會直接影響更改跟蹤功能的設置,因此如果您需要使用示例代碼,則需要致電DetectChanges()