2012-04-09 3 views
0

私はDbContextに関連付けられたいくつかのモデルを持っています。 SaveChangesを保存するモデルに基づいて別の処理を行うにはどうすればよいですか?エンティティフレームワークDbContext各モデルのSaveChangesをオーバーライド

例えば、DocumentParagraphという2つのモデルがあるとします。 Documentが追加されたときにディレクトリが作成され、Paragraphが追加されたときにファイルが作成されるように、SaveChangesを無効にするにはどうすればよいですか。

ここまでこれを実行しようとしています。

public int override SaveChanges() 
{ 
    ChangeTracker.DetectChanges(); 

    var context = ((IObjectContextAdapter)this).ObjectContext; 
    var stateEntries = context.ObjectStateManager.GetObjectStateEntries(
     EntityState.Added 
     | EntityState.Modified 
     | EntityState.Deleted 
    ).ToList(); 

    foreach (var entry in stateEntries) 
    { 
     if (!entry.IsRelationship) 
     { 
      switch (entry.State) 
      { 
       case EntityState.Added: 
        break; 

       case EntityState.Modified: 
        break; 

       case EntityState.Deleted: 
        break; 
      } 
     } 
    } 

    return base.SaveChanges(); 
} 

答えて

2

エントリは、インスタンスのタイプをチェックし、理論的にはあなたがやりたいものは何でも、論理行うことができますので、あなたの処理されたエンティティのインスタンスを保持しているEntity性質を持っています。関心事の分離を壊す -


データベースへの永続化のためにあなたのエンティティを処理するより他に何もするSaveChangesを使用しないでください。コンテキストは、アプリケーションロジックとデータベースの間のアダプタです。さらに、ファイルシステム操作とデータベース操作とを統合するこの考えは、操作が失敗した場合の状況を解決するためにはるかに複雑で慎重な処理が必要です。現在のシナリオでは、base.SaveChangesへの呼び出しに失敗すると、ファイルシステム内のディレクトリまたはファイルが孤立します。トランザクションファイルシステムを使用し、データベースとファイルシステムの操作を同じトランザクションで実行する必要があります。

あなたのコードのもう一つの問題は、あなたがファイルを挿入する前に、ディレクトリが作成されていることを確認する前ParagraphDocumentインスタンスを処理しなければならないということである、などだけでこの論理は、SaveChanges方法に属していないと呼ばれるべきではありません方法はSaveChangesです。

関連する問題