문제

나 개발 ASP.NET MVC 웹에서 응용 프로그램.NET3.5,NHibernate 및 호스팅에는 Windows Azure.을 때,웹 애플리케이션에서 실행되는 지역 개발에 직물로 잘 작동합니다.아직 때,나는 그것을 이동하는 Windows Azure,모든 삽입에서 수행 MVC 웹 역할은 끝나는 제외하고 아래와 같습니다.

어떤 아이디어의 잘못된 내 NHibernate 로직?(수 있습 세션 관리,확실하지 않)

[AssertionFailure:null id Lokad.번역합니다.체.사용자가 항목(하지 않는 플러시 후 세션에는 예외가 발생합니다)] NHibernate.이벤트입니다.기본입니다.DefaultFlushEntityEventListener.CheckId(Object obj,IEntityPersister persister,객체 id,EntityMode entityMode)+292 NHibernate.이벤트입니다.기본입니다.DefaultFlushEntityEventListener.GetValues(Object entity,EntityEntry 항목 EntityMode entityMode,Boolean mightBeDirty,ISessionImplementor 세션)+93 NHibernate.이벤트입니다.기본입니다.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent 이벤트)+158 NHibernate.이벤트입니다.기본입니다.AbstractFlushingEventListener.FlushEntities(FlushEvent 이벤트)+469 NHibernate.이벤트입니다.기본입니다.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent 이벤트)+339 NHibernate.이벤트입니다.기본입니다.DefaultFlushEventListener.OnFlush(FlushEvent 이벤트)+85 NHibernate.Impl.SessionImpl.Flush()+275 NHibernate.트랜잭션이 있습니다.AdoTransaction.Commit()+236 Lokad.번역합니다.저장소가 여기에 해당합니다.PageRepository.성(페이지) Lokad.번역합니다.컨트롤러입니다.PagesController.성(페이지) lambda_method(ExecutionScope,ControllerBase,Object[])+69 시스템입니다.웹.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) +251 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 개의 매개 변수)+31 시스템입니다.웹.Mvc.<>c__DisplayClassa.b__7()+88 시스템입니다.웹.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 필터,ActionExecutingContext preContext,Func1 continuation) +534 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 터,ActionDescriptor actionDescriptor,IDictionary`2 매개 변수)+312 시스템입니다.웹.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,문자열 actionName)+856 시스템입니다.웹.Mvc.컨트롤러입니다.ExecuteCore()+185 시스템입니다.웹.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)+221 시스템입니다.웹.CallHandlerExecutionStep.시스템입니다.웹.HttpApplication.IExecutionStep.Execute()+586 시스템입니다.웹.HttpApplication.ExecuteStep(IExecutionStep 단계,Boolean&completedSynchronously)+177

참고하는 내용 _session.FlushMode = FlushMode.Commit;User 에서 사용되는 사용자 정의 RoleProvider

public class SimpleRoleProvider : RoleProvider 
{
    readonly UserRepository Users = new UserRepository();

    public override string[] GetRolesForUser(string username)
    {
        try
        {
            var user = Users.Get(username);

            // no role if user is not registered
            if (null == user) return new string[0];

            // default role for registered user
            return user.IsManager ? new[] { "Manager", "User" } : new[] { "User" };
        }
        catch (Exception)
        {
            // role should not fail in case of DB issue.
            return new string[0];
        }
    }
}
도움이 되었습니까?

해결책 2

내가 마지막으로 솔루션을 발견하는 내 자신의 문제입니다.경우에 사람들이 관심이 있을 것 이라고,나는 게시하는 솔루션이 여기에.

public class SimpleRoleProvider : RoleProvider 
{
    // isolated session management for the RoleProvider to avoid
    // issues with automated management of session lifecycle.

    public override string[] GetRolesForUser(string username)
    {
        using (var session = GlobalSetup.SessionFactory.OpenSession())
        {
            var users = new UserRepository(session);
            var user = users.Get(username);

            // no role if user is not registered
            if (null == user) return new string[0];

            // default role for registered user
            return user.IsManager ? new[] {"Manager", "User"} : new[] {"User"};
        }
    }
}

기본적으로 어떤 일이 일어나고 있었는 RoleProvider 저장소하지 않는 것 같은 수명 주기보다는 정기적인 보기/에서 컨트롤러냅니다.결과적으로,시간이 RoleProvider 호출 NHibernate 세션에 이미 배치된 예외의 원인이 관찰 여기에서이다.

나는 대체 코드에 의하여 다음 중 하나는 여기에서이다.이것은 그것의 자신의 NHibernate 세션 관리,그리고 끝까지 작동합니다.

다른 팁

당신이해야 하지 않을 잡아 예외 및 그들을 무시 동안 NHibernate 트랜잭션이 있습니다.

나는 이유를 설명하려고합니다.

될 수 있습에 대한 예외를 인스턴스에 의한 제약 조건에서 데이터베이스입니다.(그것은 또한 수해 발생으로 매핑 문제에서 발생하는 예외를 속성이나 다른 아무것도.) NHibernate 려고 시도하는 동기화 상태에서 메모리 데이터베이스와 함께.이에 투입하고 때로는 전에 쿼리에는지 확인하는 쿼리를 수행하에 실제 데이터입니다.이 동기화를 실패할 국가 데이터베이스에서 뭔가를 임의, 일부 변경 내용이 유지되고,다른 사람은 없습니다.은 당신이 할 수있는 유일한 방법 이러한 경우에는 닫 세션이 있습니다.

는 것을 고려 의사 결정 및 계산 코드에서는 값을 기준으로 메모리에.지의 경우에는 예외는 무시,이 값은 값 데이터베이스에서,그들은 결코 거기에 있습니다.그래서 당신의 논리가 결정하고 계산서'판타지-데이터'.

방법으로, 그것은 결코 좋은 아이디어를 잡는 모든 예외를(형식화되지 않은)및 그들을 무시.당신은 항상 알고 있어야하는 예외를 처리하고,확실히 당신을 계속할 수 있습니다.

여기서 무엇을 하고 있는 삼키는 프로그래밍 오류가 있습니다.저를 믿고,시스템지 않을 것이 더 안정적입니다.이 질문은:시 오류가 발생할 때,또는 당신은 그것을 무시하기도 지속의 결과가 오류를 데이터베이스?을 때 당신은 후,당신은 당신이 없을 때 놀라 데이터베이스의 일관성과는 다른 오류가 발생 할 때 데이터를 데이터베이스에서.지 않을 것입니다 이제까지 찾는 코드의 실제적인 원인에 오류가 있습니다.

이 예외는 경우에 발생할 수 있습의 열 이름을 포함 예약어(예:사용 상태로 열 이름이 될 것이 불가능하여 저장)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top