NHibernate自动将我的对象更新到数据库,而无需在Asp.Net MVC中调用SaveOrUpdate

时间:2010-02-04 11:26:28

标签: c# nhibernate

我正在学习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中打开和关闭会话的一些建议。会这么贵吗?

非常感谢。

道明

3 个答案:

答案 0 :(得分:5)

这是默认的NHibernate行为。它会自动跟踪更改,当您刷新会话时,它将发出必要的sql语句以更新数据库中的记录。

您可以通过两种方式解决此问题:

  • 逐出你没有的实体 想要从Session
  • 更新

  • 禁用自动脏跟踪。这解释为here

答案 1 :(得分:1)

Always use transactions,并使用FlushMode.Commit

session.FlushMode = FlushMode.Commit

答案 2 :(得分:0)

Session.Flush将所有更改都保留在数据库中,因为您正在从数据库加载实体并对其进行更改,这些更改将最终存储在您的数据库中。如果你不想那样,请不要冲洗。

您也可以通过覆盖脏检查来更改该行为,但在这种情况下我认为您不会想要这样做。

如果要对实体进行更改而不希望这些更改进入数据库,则需要重新考虑会话管理。