当前位置: 首页 > 编程语言 > C#

数据库连接共享期间的Nhibernate空引用异常

时间:2023-04-11 02:05:40 C#

数据库连接期间的Nhibernate空引用异常当我的程序开始连接到WindowsXP上的MSSQL2005EXPRESSDB时,有时会出现此异常。有时我会收到此错误,有时不会...NHibernatev3DBMonitor类在单独的线程上运行,但仅在一个线程上运行,将来会在多个线程上运行。我有一个类似的SessionProviderMsSql2005类,但仅适用于SQLite连接,它有同样的问题并且sqlite的会话提供程序在多个线程上运行......System.NullReferenceException:对象引用未设置为对象的实例。在系统。Collections.Generic.Dictionary`2.Insert(TKeykey,TValuevalue,Booleanadd)atSystem.Collections.Generic.Dictionary`2.set_Item(TKeykey,TValuevalue)atNHibernate.Impl.SessionFactoryObjectFactory.AddInstance(Stringuid,字符串名称、ISessionFactory实例、IDictionary`2属性)在NHibernate.Impl.SessionFactoryImpl..ctor(配置cfg、IMapping映射、设置设置、EventListeners侦听器)在NHibernate.Cfg.Configuration.BuildSessionFactory()在MySolution.RepositorLayerSessionProviderMsSql2005.get_SessionFactory()在MySolution.DatabaseLayer.Repositories.SessionProviderMsSql2005.OpenSession()有我的SessionProviderMsSql2005类使用系统;使用System.Collections.Generic;使用NHibernate;使用NHibernate;nausing.Cfgte.Cfg.环境;namespaceMySolution.DatabaseLayer.Repositories{publicclassSessionProviderMsSql2005{privatestaticreadonlyobject_padlock=newobject();私有静态配置_configuration;publicstaticConfigurationConfiguration{get{lock(_padlock)//必须线程保存!{if(_configuration==null){if(string.IsNullOrEmpty(InitialCatalog)){thrownewNullReferenceException("PropertyInitialCatalog不能为null或为空!");}if(string.IsNullOrEmpty(ServerName)){thrownewNullReferenceException("PropertyServerName不能为null或为空!");}_configuration=新配置();_configuration.Configure("配置/Hibernate.MsSql2005.cfg.xml");_configuration.AddAssembly("MySolution.DatabaseLayer");Configuration.AddProperties(newDictionary{{Environment.ConnectionString,@"Server="+ServerName+";initialcatalog="+InitialCatalog+";IntegratedSecurity=SSPI;"}});}返回_配置;}}}私人小号staticISessionFactory_sessionFactory;publicstaticISessionFactorySessionFactory{get{lock(_padlock){if(_sessionFactory==null){lock(_padlock){_sessionFactory=Configuration.BuildSessionFactory();}}返回_sessionFactory;}}}publicstaticstringServerName{get;放;}publicstaticstringInitialCatalog{get;放;}privateSessionProviderMsSql2005(){}publicstaticISessionOpenSession(){lock(_padlock){returnSessionFactory.OpenSession();}}publicstaticvoidCloseSession(){lock(_padlock){SessionFactory.Close();}}}}我正在使用这个类:publicclassDBMonitor{privateISession_session;publicDBMonitor(stringserverName,stringinitialCatalog){SessionProviderMsSql2005.ServerName=serverName;SessionProviderMsSql2005.InitialCatalog=initialCatalog;}publicvoidStart(){_session=SessionProviderMsSql2005.OpenSession();IListdata=_session.CreateSQLQuery("SELECT*FROMsomeTableWHEREid=1").List();...}}知道是什么原因造成的吗?更新:修复了SessionFactorygetter这是正确的吗?这可能是一个多线程问题,与NHibernate没有直接关系,请参见此处的相同问答:NullReferenceExceptionwhencallingset_itemmethodofDictionaryobjectinmultithreadingscenarioDonotinitializesessionfactorylazily。在应用程序启动时执行此操作,您遇到的问题就会少得多。以上就是C#学习教程:数据库连接时Nhibernate空引用异常。侵权请点击右侧联系管理员删除。如需转载请注明出处: