为什么我的NHibernate更新不起作用?

时间:2012-10-22 00:02:05

标签: c# sql-server-2008 nhibernate asp.net-web-api autofac

我目前正在使用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&在交易提交时执行。

为什么我的更新功能无法正常工作?

谢谢!

1 个答案:

答案 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请求来说是安全的......除非有人在这里找到答案,否则我会把这个问题带到代码审查中去!

谢谢!