エンティティへの変更を追跡するための質問をすべて見てきましたが、それらのソリューションにはナビゲーション プロパティが含まれていませんでした。これは可能ですか?すべてをログに記録するだけの超汎用ソリューションは必要ありません。特定の「メイン」エンティティについてのみ追跡したい。また、監査ログは人間が判読できるカスタムのものになるため、ここの例で見たような oldData と newData を持つテーブルだけではありません。
ナビゲーション プロパティを追跡することを除いて、ほぼ良い点に到達しました。変更を追跡するかどうかを決定する POCO のサービスにインターフェイスがあり、entityService.Save
メソッドで次のチェックを行います。
var trackChangesService = this as ITrackChangesService<TClass>;
if (trackChangesService != null)
{
TClass oldEntity = Repository.GetOldEntity(entity);
trackChangesService.SaveChanges(entity, oldEntity);
}
変更の保存メソッドは、ITrackChanges インターフェイスが公開するものであり、エンティティごとにカスタム ロジックを持ちます (これには電子メール通知などが含まれます) が、問題は oldEntity を適切に取得できないことです。現在、メソッドは次のようになっています。
public TClass GetOldEntity(TClass entity)
{
//DbEntityEntry<TClass> oldEntry = Context.Entry(entity);
////oldEntry.CurrentValues.SetValues(oldEntry.OriginalValues);
//var values = oldEntry.OriginalValues;
//return (TClass)oldEntry.GetDatabaseValues().ToObject();
return Context.Set<TClass>().AsNoTracking().FirstOrDefault(x => x.Id == entity.Id);
}
私が遊んでいるコードを見ることができます。通常のプロパティの古い値と新しい値を正常に取得できますが、ナビゲーション プロパティは引き継がれません。しかし、この情報が必要です。たとえば、ユーザーを編集していて、ユーザーの編集画面でグループを削除および追加できるとします。保存ボタンをクリックすると、それらの更新が実行されます。
したがって、私の更新ビューは次のようになります。
private UserSaveModel Update(Guid id, UserSaveModel userSaveModel)
{
User user = _userService.GetOne(x => x.Id == id);
user = _userService.ConvertFromSaveModel(userSaveModel, user);
_userService.Save(user);
return userSaveModel;
}
問題を確認する 1 つの方法は、ナビゲーション プロパティを含め、既存のユーザー レコードのコンテキストでエンティティの値を調整している.ConvertFromSaveeModel()
ため、save を呼び出すと、古いナビゲーション プロパティ データがなくなることです。
このワークフローを使用してエンティティの元のナビゲーション プロパティ情報を取得する方法はありますか? そうでない場合、これを可能にするためにワークフローを変更するにはどうすればよいですか? 最初にユーザー オブジェクトをクエリせずに最初から作成すると、viewModel で公開されていない可能性のある一部のデータが渡されないため、うまくいくかどうかわかりません。他の提案はありますか?変更を加える前に、エンティティを複製して元のエンティティとして使用することはできますか? それはナビゲーション プロパティを引き継いでいますか?