我正在学习Nhibernate,有些事情我不太确定。我希望你能帮我检查一下我的代码。如您所见,下面的代码我没有调用“ SAVE ”,它仍然会更新数据库的值。可能存在我想要更改对象值并且不想将它们保存回数据库的情况。我该怎么做?
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateShoppingCart(FormCollection collection)
{
int customerID = int.Parse(collection["CustomerID"]);
foreach (var item in _shoppingCartItemReopository.GetByCustomerID(customerID))
{
item.DateUpdated = DateTime.Now;
// update item one by one
//_shoppingCartItemReopository.Save(item);
}
return RedirectToAction("GetUserShoppingCart", new { id = customerID });
}
在我的Gloabal.asax.cs文件中:
protected void Application_BeginRequest(object sender, EventArgs e)
{
ManagedWebSessionContext.Bind(HttpContext.Current, SessionManager.SessionFactory.OpenSession());
}
protected void Application_EndRequest(object sender, EventArgs e)
{
ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionManager.SessionFactory);
if (session != null)
{
try
{
if (session.Transaction != null && session.Transaction.IsActive)
{
session.Transaction.Rollback();
}
else
{
session.Flush();
}
}
finally
{
session.Close();
}
}
}
我希望您可以检查我的代码并提供有关在Application_BeginRequest和Application_EndRequest中打开和关闭会话的一些建议。会这么贵吗?
非常感谢。
道明
答案 0 :(得分:5)
这是默认的NHibernate行为。它会自动跟踪更改,当您刷新会话时,它将发出必要的sql语句以更新数据库中的记录。
您可以通过两种方式解决此问题:
或
答案 1 :(得分:1)
Always use transactions,并使用FlushMode.Commit
session.FlushMode = FlushMode.Commit
答案 2 :(得分:0)
Session.Flush将所有更改都保留在数据库中,因为您正在从数据库加载实体并对其进行更改,这些更改将最终存储在您的数据库中。如果你不想那样,请不要冲洗。
您也可以通过覆盖脏检查来更改该行为,但在这种情况下我认为您不会想要这样做。
如果要对实体进行更改而不希望这些更改进入数据库,则需要重新考虑会话管理。