2012-10-22 2 views
2

В настоящее время я использую ASP.NET Web Api вместе с NHibernate & Autofac ... У меня возникла проблема, когда мое обновление не привязано к базе данных. Я использую ActionFilterAttribute открывать и закрывать передаст каждый раз, когда действие выполняется следующим образом:Почему обновление моего NHibernate не работает?

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; 
} 

Из того, что я читал, если изменение объекта во время операции, нет необходимости вручную вызвать обновление или SaveOrUpdate, поскольку это отслеживается NHibernate &, выполняемым при совершении транзакции.

Почему моя функция обновления не работает должным образом?

Спасибо!

+0

Откуда вызывается обновление? Что такое Get? Больше кода, эти фрагменты бесполезны. – Euphoric

+0

Euphoric, вот мой полный класс репозитория: http://pastebin.com/raw.php?i=bsQFL1fs – slashp

+0

Я бы действительно проверял отладчик, если все сеансы/транзакции одинаковы для курса действия. Там может быть некоторое создание других сеансов/транзакций. Я бы попытался лишить код базового сеанса/get/update/commit и медленно добавить дополнительный код, чтобы проверить, какая часть кода вызывает эту ошибку. – Euphoric

ответ

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(); 
    } 

Проблема, которую я имел после реализации этого кода является то, что логика не sound..when на сессии DI'ed в моем хранилище ISession, он не является автоматически связаны. Мое решение было связать его в конструкторе моего репозитория, как так:

public ClientRepository(ISession session) 
    { 
     if (session == null) throw new ArgumentNullException("nhSession"); 
     this._session = session; 
     CurrentSessionContext.Bind(_session); 
    } 

Но я не на 100% уверен, что это будет безопасно с большим количеством одновременных запросов HTTP ... собирается довести этот вопрос чтобы проверить код, если у кого-то нет ответа для меня здесь!

Спасибо!

Смежные вопросы