2016-11-15 12 views
8

Von dem, was ich gelesen habe, verhindert die Einstellung ProxyCreationEnabled = false die Änderungsverfolgung und das verzögerte Laden. Allerdings ist mir nicht klar, was Change Tracking abdeckt.Deaktivieren der Erstellung von Entity Framework-Proxys

Wenn ich es deaktivieren und eine Entität aus der Datenbank abrufen, Änderungen daran vornehmen und festschreiben, werden diese Änderungen gespeichert. Ich bin noch in der Lage auch modifizierte Einträge aus dem Change zu erhalten:

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

Sollte dies möglich sein, wenn ich deaktiviert Proxy-Erstellung habe? Ich möchte es deaktivieren, aber ich möchte klarstellen, was ich verhindern kann.

Antwort

5

Änderungsverfolgung und Proxy-Erstellung sind zwei verschiedene Szenarien. Wenn Sie die Änderungsverfolgung deaktivieren müssen, müssen Sie dies wie unten gezeigt tun.

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

Dann können Sie dies nicht tun ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList().

Wenn Sie die Proxy-Erstellung deaktivieren müssen, müssen Sie dies im Konstruktor Ihres Kontexts tun, wie unten gezeigt.

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

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

Der Proxy-Erstellungsmechanismus wird verwendet, um das verzögerte Laden von Beziehungen zu unterstützen. EF erstellt keine Proxys für Typen, für die der Proxy nichts zu tun hat. Mit anderen Worten, wenn Sie keine virtual Eigenschaften für Ihre POCO-Klassen haben, gibt es keinen Effekt, entweder Sie haben es deaktiviert oder nicht.

Wenn Sie Ihre Entitäten serialisieren, sollten Sie Proxies und Lazy Loading deaktivieren, da das Deserialisieren von Proxys schwierig sein kann.

Sie können mehr darüber lesen Sie hier: Entity Framework Working with Proxies

9

ich diese Einstellung ProxyCreationEnabled auf false in EF nicht Änderungsverfolgung wirkt sich bestätigen kann. Sie haben mich tatsächlich mit dieser Frage fasziniert, da ich dachte, ich wüsste die Antwort, aber um das zu bestätigen, habe ich einen schnellen Testfall erstellt.

Siehe unten Beispiel-Code, der ein gültiges Szenario darstellt:

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; } 
    } 
} 

Das einzige, was die Proxy-Generierung zu deaktivieren beeinflussen sollte die träges Laden Funktionalität von EF ist, wenn Sie virtual Navigationseigenschaften auf ein anderes Modell verwenden. Der Change Tracker ist unabhängig und arbeitet von dem zugrunde liegenden ObjectContext selbst.

Eine vollständige Antwort bezogenen Tracking zu ändern, ist es wahrscheinlich erwähnenswert, dass AutoDetectChangesEnabled scheint die einzige Einstellung, die direkt ändern Tracking-Funktionalität beeinträchtigen würde, Sie benötigt DetectChanges() anrufen, wenn Sie Ihren Beispielcode zu verwenden, benötigt.

Verwandte Themen