异常:
未将对象引用设置到对象的实例。
NHIbernateTest01
在 NHIbernateTest01.NHibernateHelper.OpenSession() 位置 C:\Users\Administrator\Desktop\暗夜\Hibernate\NHIbernateTest01\NHIbernateTest01\NHibernateHelper.cs:行号 70
在 NHIbernateTest01.Program.Main(String[] args) 位置 C:\Users\Administrator\Desktop\暗夜\Hibernate\NHIbernateTest01\NHIbernateTest01\Program.cs:行号 26
NHibernate.ISession OpenSession()
NHibernateHelper:(摘自NHibernate的Session管理策略和NHibernateHelper)
public sealed class NHibernateHelper
{
private static ISessionFactory sessionFactory = null;
#region 初始化 生成SessionFactory,并配置上下文策略
public static void Instance(string currentSessionContextClass)
{
sessionFactory = new Configuration().Configure()
.SetProperty("current_session_context_class", currentSessionContextClass)
.BuildSessionFactory();
}
#endregion
#region Session在当前上下文的操作
private static void BindContext()
{
if (!CurrentSessionContext.HasBind(sessionFactory))
{
CurrentSessionContext.Bind(sessionFactory.OpenSession());
}
}
private static void UnBindContext()
{
if (CurrentSessionContext.HasBind(sessionFactory))
{
CurrentSessionContext.Unbind(sessionFactory);
}
}
public static void CloseCurrentSession()
{
if (sessionFactory.GetCurrentSession().IsOpen)
{
sessionFactory.GetCurrentSession().Close();
}
}
public static ISession GetCurrentSession()
{
BindContext();
return sessionFactory.GetCurrentSession();
}
#endregion
#region 关闭SessionFactory(一般在应用程序结束时操作)
public static void CloseSessionFactory()
{
UnBindContext();
if (!sessionFactory.IsClosed)
{
sessionFactory.Close();
}
}
#endregion
#region 打开一个新的Session
public static ISession OpenSession()
{
return sessionFactory.OpenSession();
}
#endregion
}
配置文件:
<configuration>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
</configSections>
</configuration>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.Sql2008Dialect</property>
<property name="show_sql">true</property>
<property name="connection.connection_string">
Data Source=localhost;User Id = sa;Password=123;Persist Security=true;Initial Catalog=TestDB;
</property>
</session-factory>
</hibernate-configuration>
</configuration>
映射文件:
<hibernate-mapping xmlnx="urn:nhibernate-mapping-2.2" assmebly="NHibernateTest01" namespace="NHibernateTest01">
<class name="Person" table="Person">
<id name="Id" column="UserId">
<generator class="guid" />
</id>
<property name="Name" column="Name" />
<property name="Age" column="Age" />
</class>
</hibernate-mapping>
运行程序:
Person p = new Person();
p.Id = Guid.NewGuid();
p.Name = "张三";
p.Age = 29;
try
{
ISession isession = NHibernateHelper.OpenSession();
using (ITransaction trans = isession.BeginTransaction())
{
isession.Save(p);
trans.Commit();
}
}
catch (Exception ex)
{
string str = ex.Message + "\n\r" + ex.Source + "\n\r" + ex.StackTrace + "\n\r" + ex.TargetSite;
File.WriteAllText(@"C:\Users\Administrator\Desktop\暗夜\newLog.txt", str, Encoding.Default);
}
Program.cs:行号 26
这是哪一行?
ISession isession = NHibernateHelper.OpenSession();
在执行的过程中,调用NHibernateHelper.OpenSession()时,报了错
@blackday:
1、private static ISessionFactory sessionFactory = null;
sessionFactory 是空对象。
2、你没有初始化这个对象
#region 初始化 生成SessionFactory,并配置上下文策略
public static void Instance(string currentSessionContextClass)
{
sessionFactory = new Configuration().Configure()
.SetProperty("current_session_context_class", currentSessionContextClass)
.BuildSessionFactory();
}
3、所以你直接调用NHibernateHelper.OpenSession()的时候,
#region 打开一个新的Session
public static ISession OpenSession()
{
return sessionFactory.OpenSession();
}
#endregion
}
sessionFactory是空对象,这句就会报错的。