あなたのコードはスレッドセーフではありません: 2 人のユーザーがページに同時にアクセスすると、ViewCount は 2 ではなく 1 ずつ増加します (値は DB 自体ではなく DB コンシューマーによって増加されるため)。これは、SQLUPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id
を直接実行することで解決できます。DBMS は同時実行保護を提供します。
とにかく、同じセッション内の追加のビューによってビュー カウントがインクリメントされるのを防ぐには、次のように、セッションに格納されているハッシュセットを使用します。
public ActionResult Details(Int32 id ) {
HashSet<Int32> productsSeen = (HashSet<Int32>)Session["ProductsSeen"];
if( productsSeen == null ) {
Session["ProductsSeen"] = productsSeen = new HashSet<Int32>();
}
if( !productsSeen.Contains( id ) ) {
db.Execute("UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id", new { id = id } ); // psuedocode. This isn't a real EF construct.
db.SaveChanges();
}
return View( product );
}