随机NHibernate IndexOutOfRange异常

时间:2010-12-14 01:28:00

标签: c# nhibernate

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

2 个答案:

答案 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(或其他类似的东西)所以我会等待该解决方案来制作真正的解决方案。