2015-10-22 3 views
1

Очень редко w3wp.exe сбой на сервере Production и анализ точек вызова в NHibernate. Запрос тривиален.NHibernate сбой IIS в простом запросе

Это ошибка, которую я получаю.

System.Reflection.TargetInvocationException: Исключение было выбрано целью вызова. System.AccessViolationException: Попытка чтения или записи защищенной памяти. Это часто является признаком того, что другая память повреждена в System.RuntimeMethodHandle.InvokeMethod (Object target, Object [] arguments, Signature sig, Boolean constructor) в System.Delegate.DynamicInvokeImpl (Object [] args) at NHibernate.Impl .ExpressionProcessor.FindValue (выражение) в p: \ nhibernate-core \ src \ NHibernate \ Impl \ ExpressionProcessor.cs: строка 228 в NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression (выражение слева, выражение справа, тип выражения ExpressionType) в p: \ nhibernate-core \ src \ NHibernate \ Impl \ ExpressionProcessor.cs: строка 492 в NHibernate.Impl.ExpressionProcessor.ProcessOrExpression (выражение BinaryExpression) в p: \ nhibernate-core \ src \ NHibernate \ Impl \ ExpressionProcessor.cs: строка 556 at NHibernate.Criterion.QueryOver 2.Add(Expression 1 выражение) в p: \ nhibernate-core \ src \ NHibernate \ Criterion \ QueryOver.cs: строка 750 at Backend.DataAccess.AccountFeatureRepo.GetAccountFeatureByIdAndCode (Int32 accountId, AccountFeatureCode accountFeatureCode) в d: \ builds \ Backend.DataAccess \ Repository \ AccountFeatureRepo.cs : линия 43

Это код.

using (var session = GetSession()) 
{ 
    var result = session.QueryOver<AccountFeature>() 
     .Where(af => af.AccountId == accountId) 
     .And(af => af.FeatureCode == accountFeatureCode.ToString()) 
     .And(af => af.ActiveYN == "Y") 
     .And(af => af.StartDatetime == null || af.StartDatetime < DateTime.UtcNow) 
     .And(af => af.EndDatetime == null || af.EndDatetime >= DateTime.UtcNow) 
     .OrderBy(af => af.Id).Desc 
     .Take(1) 
     .List(); 

    return (result != null && result.Count > 0) ? result[0] : null; 
} 

private static ISession GetSession() 
{ 
    return SessionProvider.SessionFactory.OpenSession(); 
} 

Я не могу воспроизвести ошибку, и я не могу придумать что-то не так с кодом. Аргументы (идентификатор учетной записи и код функции) проверяются досрочно, поэтому здесь нет мусора. Я также боюсь, что с таким крахом я смотрю на кучу коррупции, которая возникла где-то еще в коде, и эта часть все в порядке.

Спасибо! T

ответ

1

Эта проблема вызвана компиляцией дерева выражений элемента, который является нулевым, и вы вызываете метод или пытаетесь его оценить.

Я вижу ProcessOrExpression в stacktrace, поэтому он может иметь какое-то отношение к вашей нулевой проверке даты. Попробуйте Projections.SqlFunction («coalesce») в день для SqlDateTime.MinValue для StartDate и SqlDateTime.MaxValue для EndDate.

Я также хотел бы проверить, не является ли accountFeatureCode значением null перед вызовом ToString на нем.