随机NHibernate似乎因IndexOutOfRange异常而失败。代码大部分工作时间,但会导致随机应用程序崩溃。
public T GetByID<T>(Guid Id) where T : Modules.Common.EntityBase
{
try
{
ISession session = NHibernateHelper.GetCurrentSession();
var product = session
.CreateCriteria(typeof(T))
.Add(Restrictions.Eq("Id", Id))
.UniqueResult<T>();
return product;
}
catch (HibernateException ex)
{
NHibernateHelper.CloseSession();
throw;
}
}
我正在使用WCF服务上的代码,其中为每个单独的httpcontext管理ISession,所以我认为这不是由于线程安全。 Exception来自DataReader所以我猜它是来自UniqueResult行。
以下是获取当前会话功能
public static ISession GetCurrentSession()
{
if (HttpContext.Current == null)
{
lock (sessionLock)
{
if (_session == null)
_session = sessionFactory.OpenSession();
}
return _session;
}
HttpContext context = HttpContext.Current;
ISession currentSession = context.Items[CurrentSessionKey] as ISession;
if (currentSession == null)
{
currentSession = sessionFactory.OpenSession();
context.Items[CurrentSessionKey] = currentSession;
}
return currentSession;
}
答案 0 :(得分:1)
答案 1 :(得分:0)
原来在WCF中HttpConext为null,这是因为我基于当前HTTPContext的线程分离(假设它的功能类似于常规的Web应用程序)。
看到Getting NHibernate to work with WCF的教程看起来可能有用,但在实施解决方案时遇到了问题。然而,在每个请求场景中使用此方法似乎很复杂......就像5个对象一样,它需要修改每个服务。
请注意,如果它们仅在HTTP环境中工作,则可以使用AspNetCompatibilityRequirements属性和config部分来使WCF具有HTTPContext值。
类别:
[System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Required)]
public class CaseService : ServiceBase, ICaseService
{
...
}
的Web.config:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
</system.serviceModel>
我在某处读到了NHibernate 3.0中提供的WCFSessionProvider(或其他类似的东西)所以我会等待该解决方案来制作真正的解决方案。