0
エンティティフレームワークからエンティティを返すサービスクラスにGetAll()という名前のメソッドがあります。トラッキングせずにエンティティを変更する
私はいくつかのロジックに従って修正ビューのデータを表示したいpublic ActionResult List()
{
var tasklogs = _timeLogService.GetAll()
.Select(l=>{
l.StartTime.Value.AddHours(1);
return l;
});
return PartialView(tasklogs);
}
は、この例では、私は元の日付に1時間を追加します。方法は以下の通りです。
問題は、ページをリフレッシュすると、各ページのリフレッシュ時間が増加することがわかります。つまり、GetAll()メソッドは最後に変更された値を返します。データベースの変更がGetAllによって変更された日付が返されます。
私は、これが機能するにはエンティティを切り離す必要があると私は読んでいます。
私は多くの場所でそれをやる必要があるので、私の質問は、サービス層でそれを行うための良い方法があるということです。日付を変更する根本的な原因は、日付をUTC(db)で保存することですが、ビューに表示すると、コントローラのアクションでローカルタイムゾーンに変換されます。
私はそれを明確にしたいと思います。私のコメントに書かれたとおり、私は要求ごとにDbContextインスタンスの作成を変更した後
おかげ
解決策の1つは、EFエンティティを直接表示しないことです。このような理由から、ビューモデルクラスをデータアクセスクラスとは別に保つようにしてください。しかし、もしあなたが*それをしなければならないならば、あなたのデータを注意深く*注意する* AsNoTrackingを使用してください。 –
これは実際には "トラッキング"問題のようには聞こえません。あなたのコードは、私が見ることができるどこにでも更新されたデータを保存していません。ほとんどの場合、 'DbContext'のインスタンスを1つだけ保持しています。このインスタンスはすべてのエンティティをロードし続け、アンチパターンです。実行するすべての論理データ操作に対して 'DbContext'の新しいインスタンスを用意する必要があります。これは通常、ActionMethodごとに1つの新しいインスタンスを意味します。 –
@BradleyUffnerあなたは正しいですが、私はDbContextのインスタンスが1つしかなく、したがって問題がありました。リクエストごとにインスタンスに変更した後で解決されました。 –