2011-08-03 12 views
0

Override Save Changes質問のコードを使用してアプリケーションで監査を実装しました。エンティティが追加されると、すべてが素晴らしいです。ただし、エンティティが変更されると、「CreatedOn」日付はロードされません。Entity Framework 4.1 DbContext上書きSaveChangesプロパティが読み込まれない

これは常にnullなので、最初の "CreatedOn"日付はデータベースから削除されます。

また、エンティティに格納されているOriginalValuesコレクションを調べてみましたが、 "ModifiedOn"日付には作成されましたが、 "CreatedOn"日付には挿入されませんでした。両方のフィールドにデータベースが設定されています...なぜ、EFによってロードされ、ロードされないのでしょうか?

public override int SaveChanges() 
    { 
     var changeSet = ChangeTracker.Entries<IAuditable>(); 

     if (changeSet != null) 
     { 
      foreach (DbEntityEntry<IAuditable> entry in changeSet) 
      { 
       switch (entry.State) 
       { 
        case EntityState.Added: 
         entry.Entity.CreatedOn = DateTime.Now; 
         entry.Entity.ModifiedOn = DateTime.Now; 
         break; 
        case EntityState.Modified: 
         entry.Entity.ModifiedOn = DateTime.Now; 

         //entry.Entity.CreatedOn date always null here 
         break; 
       } 
      } 
     } 

     return base.SaveChanges(); 
    } 
+0

解決方法をお探しですか?今日私はあなたとほぼ同じ問題にぶつかりました。私のケースでは、nullになるのは 'UpdatedBy' /' UpdatedById'です。興味深いことに、 'UpdatedOn'はSSMSの行をチェックしても、' UpdatedOn'も 'UpdatedById'もNULLではありません。私は、監査フィールドが何らかの形で互いに衝突しているのだろうかと疑問に思っています.3つすべてが同じエンティティを指していることを前提としています... –

+1

私は決して解決策を見出しませんでした。保存する前にデータベース。余分なデータベース呼び出しを持つのは理想的ではありませんが、機能します。 – Neil

+1

昨晩、私はこれを掘り下げて、DBSet.Remove(エンティティ)がnull(これは 'SaveChanges()'を呼び出す前でも)に自分のプロパティを設定したことを知りました。これは明らかに[設計上の](http://stackoverflow.com/a/6782744/88709)ですが、これはロジックを階層に移動してリポジトリに移動する必要が生じたためです。私はむしろDbContextに実装されているソフト削除をもっとDRYにしたいと思うでしょう。とにかくあなたの更新をありがとう! –

答えて

2

多分MVCコンテキストで使用していますか?そうであれば、エンティティプロパティCreatedOnとModifiedOnをページの非表示フィールドに入れないからです。私はこの問題を抱えており、部分的な見解でそれを解決しています。

/*My Partial View View/Shared/HiddenSystemValues.cshtml */ 
@model Models.IAuditable 
@Html.HiddenFor(model => model.CreatedOn) 
@Html.HiddenFor(model => model.ModifiedOn) 
... 


/*In All My Pages */ 
... 
@Html.Partial("HiddenSystemValues") 
... 
関連する問題