2016-12-15 21 views
-1

エンティティフレームワークが追加、変更、削除されているかどうかを正しく確認する方法を探しています。現在、それが働いているエンティティフレームワークのチェック、追加、変更、削除

int state = 0; 

    var added = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
    var modified = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified).ToList(); 
    var deleted = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted).ToList(); 

     if (added.Count > 0) 
      state = 1; 
     if (modified.Count > 0) 
      state = 2; 
     if (deleted.Count > 0) 
      state = 3; 

:以下は私のコーディングです。私はちょうどそれを行うための他の適切な方法があるかどうかを知りたい。パフォーマンスを向上させるために

+1

私はこのようなチェックの必要性を見たことがありません。保留中の変更があると思われる場合は、SaveChanges()を実行して移動します。 あなたの質問は、あなたが何を必要としているかを私に不思議に思っています。あなたはそれについて詳述できますか? また、実際のコードではなく、単純なバージョンである可能性があります。ただし、1つのエントリが変更され、別のエントリが削除されるとどうなりますか?あなたの例では、状態が上書きされているようです。私はあなたがより精巧な状態追跡構造を持っていると思いますか? –

+0

@StreamcapこんにちはStreamcap。実際に何をしているのですか?自分のEFに変更を記録し、そのコメントを書き留める必要があります。たとえば、EFが追加された場合、「新規作成(何か)」となります。変更された場合は「更新(何か)」となります。現在、一度に変更できるエントリは1つだけです。それが正しいと思いますか?ありがとう – Farid

+0

@ファリッドこれを行うにはいくつかの方法があります。 1つの方法(粗ではあるが)は、挿入/更新/削除時にログ行を書き込むトリガーをデータベースに入れることです。もう1つは、変更の詳細な検出が必要な場合に備えて、ロギングフレームワークを使用することです。 Serilogを調べることをお勧めします。余分な作業を必要とせずに、無料で、強力です。 –

答えて

0

  • あなたはすべての事業体とのリストを作成するのではなく、Anyを使用することができます。
  • 以前は

コード発見された場合は、fullowing state値のいずれかを決定する必要はありません。

int state = 0; 

if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Deleted)) 
{ 
    state = 3; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Modified)) 
{ 
    state = 2; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added)) 
{ 
    state = 1; 
} 
0

あなたは、エンティティフレームワーク6を使用している場合、あなたはoverride SaveChanges()

することができます
public override int SaveChanges() 
{ 
    var addedEntites= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Added) 
         .Select(p => p.Entity); 

    var modified= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Modified) 
         .Select(p => p.Entity); 

    var now = DateTime.UtcNow; 

    foreach (var added in addedEntites) 
    { 
    added.CreatedAt = now; 
    added.LastModifiedAt = now; 
    } 

    foreach (var modified in modified) 
    { 
    modified.LastModifiedAt = now; 
    } 

    return base.SaveChanges(); 
} 

@Matthias Burgerの示唆するように、パフォーマンスに影響します。 uldはデータベース側にとどまるトリガーなどを使用することをお勧めします。

関連する問題