2016-11-15 6 views
8

私が読んだところでは、ProxyCreationEnabled = falseを設定すると、変更の追跡と遅延ロードを防ぐことができます。しかし、私は変更の追跡がどのようなものであるかについてはっきりしていません。Entity Frameworkプロキシの作成を無効にする

無効にしてデータベースからエンティティを取得し、変更してコミットすると、その変更が保存されます。私はまだもChangeTrackerから変更されたエントリを取得することができるよ:

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

私は無効プロキシの作成をしたとき、これは可能でしょうか?私はそれを無効にしたいが、私は何を無効にしているのかを明確にしたい。

答えて

5

変更追跡とプロキシ作成は、2つの異なるシナリオです。変更の追跡を無効にする必要がある場合は、以下のように変更する必要があります。

これはできません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プロパティがない場合、無効にしても無効にしても効果はありません。

エンティティをシリアル化する場合は、プロキシをデシリアライズするのが難しいため、プロキシと遅延ロードの切り替えを検討してください。

あなたはここでそれについての詳細を読むことができます:私はEFでfalseにProxyCreationEnabledを設定することないは、変更の追跡に影響を与えないことを確認することができますEntity Framework Working with Proxies

9

。私は答えを知っていると思ったので、実際にこの質問で私を魅了しましたが、私は簡単なテストケースを作成したことを確認しました。

有効なシナリオを表しているサンプルコードは、以下を参照してください:あなたは別のモデルにvirtualナビゲーションプロパティを使用しているときにプロキシの生成を無効にする影響を与えるべきであると

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の遅延ロード機能です。変更トラッカーは独立しており、基礎となるObjectContext自体から動作します。

変更追跡に関する完全な回答については、AutoDetectChangesEnabledが変更追跡機能に直接影響する唯一の設定であるように思われますので、サンプルコードを使用する必要がある場合はDetectChanges()に電話する必要があります。

関連する問題