NHibernate автоматически обновляет мои объекты в базе данных без вызова SaveOrUpdate в Asp.Net MVC - PullRequest
2 голосов
/ 04 февраля 2010

Я изучаю 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. Будет ли делать это дорого?

Большое спасибо.

Daoming

Ответы [ 3 ]

5 голосов
/ 04 февраля 2010

Это стандартное поведение NHibernate.Он автоматически отслеживает изменения и, когда вы сбрасываете сеанс, выдает необходимые операторы SQL для обновления записей в БД.

Это можно решить двумя способами:

  • исключить объекты, которые вы не хотите обновлять из сеанса

или

  • отключить автоматическое отслеживание грязных данных.Это объясняется здесь .
1 голос
/ 04 февраля 2010

Всегда использовать транзакции и использовать FlushMode.Commit

session.FlushMode = FlushMode.Commit
0 голосов
/ 04 февраля 2010

Session.Flush сохраняет все изменения в базе данных, так как вы загружаете сущность из вашей базы данных и вносите в нее изменения, которые окажутся в вашей базе данных.Если вы этого не хотите, не сбрасывайте.

Вы также можете изменить это поведение, переопределив грязную проверку, но я не думаю, что вы захотите этого в этом случае.

Если вы хотите внести изменения в сущность и не хотите, чтобы эти данные были включены в вашу базу данных, вам нужно переосмыслить управление сеансом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...