首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个请求的nHibernate会话和异常管理

每个请求的nHibernate会话和异常管理
EN

Stack Overflow用户
提问于 2012-12-28 12:19:30
回答 1查看 390关注 0票数 4

我有一个类似的场景:每个请求都使用nHibernate会话的Asp.NET MVC4网站。会话是通过Get和Save方法使用Ninject注入到存储库中的。

有很多文章讨论每个请求的会话,并说这是在web应用程序上做事情的方式。

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

代码语言:javascript
复制
Read Data From Database
Alter Entity information
Save to Database
Read another entity
Alter entity
Save ... but an EXCEPTION OCCURS

我想用消息向用户显示我的视图。但我还必须刷新生成的网页,因此我还必须从数据库中读取一些信息。

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

但是我在这里找不到任何关于最好的方法的文章。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-29 04:07:44

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

我在我的一些操作中这样做,在这些操作中,我希望发生唯一键冲突,并且我必须在模型中重新加载查找数据。下面是一个例子:

代码语言:javascript
复制
    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);
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14064517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档