我目前正在使用ASP.NET Web Api和NHibernate& Autofac ...我遇到的问题是我的更新没有提交到数据库。每次执行动作时,我都会使用ActionFilterAttribute来打开和关闭转码:
private ISessionFactory SessionFactory { get; set; }
public TransactionAttribute()
{
SessionFactory = WebApiApplication.SessionFactory;
}
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
session.BeginTransaction();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var session = SessionFactory.GetCurrentSession();
var transcation = session.Transaction;
if (transcation != null && transcation.IsActive)
{
transcation.Commit();
}
session = CurrentSessionContext.Unbind(SessionFactory);
session.Close();
}
哪个适用于我的存储库中的添加,读取和删除功能。不幸的是,我的更新似乎没有起作用(尽管我已经尝试过几种方式):
public bool Update(Client client)
{
var result = Get(client.ClientID);
if (result == null)
{
return false;
}
result.Name = client.Name;
result.Acronym = client.Acronym;
result.Website = client.Website;
return true;
}
从我读过的内容中,如果在事务中修改对象,则无需手动调用Update或SaveOrUpdate,因为NHibernate&在交易提交时执行。
为什么我的更新功能无法正常工作?
谢谢!
答案 0 :(得分:0)
我自己想出来了 - 基本上我创建了2个会话(一个在我的TranscationAttribute中,一个由于DI进入我的存储库)。它创建两个的原因在OnActionExecuting语句中非常明确......我没有检查是否有任何会话工厂当前绑定到CurrentSessionContext。这是我正在使用的新代码:
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (!CurrentSessionContext.HasBind(SessionFactory))
{
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
var session = SessionFactory.GetCurrentSession();
session.BeginTransaction();
}
实现此代码后我遇到的问题是逻辑不正确..当会话进入我的存储库ISession时,它没有被自动绑定。我的解决方案是将它绑定在我的存储库的构造函数中,如下所示:
public ClientRepository(ISession session)
{
if (session == null) throw new ArgumentNullException("nhSession");
this._session = session;
CurrentSessionContext.Bind(_session);
}
但是我并不是百分之百确定这对于许多同步的HTTP请求来说是安全的......除非有人在这里找到答案,否则我会把这个问题带到代码审查中去!
谢谢!