4

我有一个类似的场景: Asp.NET MVC 4 website using nHibernate Session Per Request。使用 Ninject 将会话注入到具有 Get 和 Save 方法的存储库中。

有很多文章谈论 Session Per Request 并说这是在 Web 应用程序上做事的方式。

但是我在实现这样的逻辑时遇到了问题:

Read Data From Database
Alter Entity information
Save to Database
Read another entity
Alter entity
Save ... but an EXCEPTION OCCURS

我想通过一条消息向用户展示我的观点。但我还必须刷新生成的网页,所以我还必须从数据库中读取一些信息。

根据 nHibernate 文档,必须丢弃带有异常的会话Documentation Here

但我在这里找不到任何关于最佳方式的文章。

这种情况的最佳方法是什么?我将不得不向我的存储库对象注入一个新的会话?

谢谢。

4

1 回答 1

4

您可以从原始会话的 SessionFactory 属性创建一个新会话。您可以通过在存储库类中公开它或将其注入控制器来访问原始会话对象。然后,您可以使用新会话创建一个新存储库。

我在一些我期望发生唯一键违规的操作中执行此操作,并且我必须在模型中重新加载查找数据。这是一个例子:

    public ActionResult Create(MeasuresEditView model)
    {
        if (ModelState.IsValid)
        {
            using (var txn = _session.BeginTransaction())
            {
                try
                {
                    var measure = new Measure { Code = model.Code };
                    _session.Save(measure);
                    txn.Commit();
                    return RedirectToAction("Index");
                }
                catch (UniqueKeyException)
                {
                    txn.Rollback();
                    var msg = string.Format("A measure with the code '{0}' already exists, please enter a different code or cancel.", model.Code);
                    ModelState.AddModelError("Code", msg);
                }
                catch (Exception ex)
                {
                    if (txn.IsActive)
                    {
                        txn.Rollback();
                    }
                    log.Error("Create", ex);
                    throw;
                }
            }
        }
        // have to rebuild selectlist on post in new txn in case it was rolled back
        using (var session = _session.SessionFactory.OpenSession())
        using (var txn = session.BeginTransaction())
        {
            SetProductGroupSelectList(session, model, manualId);
            txn.Commit();
        }
        return View(model);
    }
于 2012-12-28T20:07:43.650 回答