2012-10-22 4 views
2

현재 NHibernate & Autofac과 함께 ASP.NET 웹 API를 사용하고 있습니다 ... 내 업데이트가 데이터베이스에 커밋되지 않는 문제가 있습니다.내 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(); 
} 

, 읽고, 내 저장소에서 삭제 기능 : 나는 열고 transcation에게 액션이과 같이 수행 할 때마다 닫는 ActionFilterAttribute을 사용하고 있습니다. 불행하게도, 내 업데이트 (나는 그것을 몇 가지 방법을 시도했습니다 불구하고) 작동하지 않는 것 : 내가 읽은 바로는

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되지 않은 논리가 내 저장소 ISession에 DI'ed되어, 그것은없는 :이 내가 사용하고 새로운 코드 자동으로 바인딩됩니다. 내 솔루션은 지금처럼 내 저장소의 생성자에서 바인딩하는 것이었다 :

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

하지만이 많은 동시 HTTP 요청에 안전 할 것입니다 있는지 100 % 아니에요 ...이 질문을 가지고가는 누군가가 나를 위해 대답을하지 않는 한 코드 검토를 끝내라!

감사합니다.

관련 문제