我有一个类似的场景:每个请求都使用nHibernate会话的Asp.NET MVC4网站。会话是通过Get和Save方法使用Ninject注入到存储库中的。
有很多文章讨论每个请求的会话,并说这是在web应用程序上做事情的方式。
但我在实现这样的逻辑时遇到了问题:
Read Data From Database
Alter Entity information
Save to Database
Read another entity
Alter entity
Save ... but an EXCEPTION OCCURS我想用消息向用户显示我的视图。但我还必须刷新生成的网页,因此我还必须从数据库中读取一些信息。
根据nHibernate文档,必须丢弃包含异常的会话Documentation Here
但是我在这里找不到任何关于最好的方法的文章。
对于这种情况,最好的方法是什么?我将不得不向我的存储库对象?注入一个新会话。
谢谢。
发布于 2012-12-29 04:07:44
可以从原始会话的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);
}https://stackoverflow.com/questions/14064517
复制相似问题