您的代码不是线程安全的:如果两个用户同时访问该页面,则 ViewCount 将增加 1 而不是 2(因为该值由 DB 使用者而不是 DB 本身增加)。您可以通过直接运行 SQL 来解决此问题UPDATE 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 );
}