从 NHibernate 开始
Starting on NHibernate
我开始使用 NHibernate,但我有点不知所措。我只是想用尽可能少的代码来映射一个简单的 table 并查询它的所有成员。
我知道我应该从 xml 映射开始,但是,相反,我正在尝试使用属性映射(感觉比流畅更干净、更有效率,比 xml 更容易维护)
我的 class - 映射一个名为 "cars" 的 table 是这样的:
[Class(NameType = typeof(Cars),
Lazy = true,
Table = "Cars")]
public class Cars
{
[Property(Column = "Prefix")]
public virtual int Prefix { get; set; }
[Property(Column = "Status")]
public virtual int Status { get; set; }
[Property(Column = "Ip")]
public virtual string Ip { get; set; }
[Property(Column = "Port")]
public virtual int Port { get; set; }
[Property(Column = "CommStatus")]
public virtual int? CommStatus { get; set; }
[Property(Column = "TimeToRetry")]
public virtual DateTime? TimeToRetry { get; set; }
[Property(Column = "dsc")]
public virtual string dsc { get; set; }
[Property(Column = "Company")]
public virtual int Company { get; set; }
}
我的 hibernate.cfg.xml 配置文件是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">Server=.;Initial Catalog=TestDatabase;User Id=sa;Password=somethingelse!@#$;</property>
</session-factory>
</hibernate-configuration>
最后,我将以尽可能小的方式启动会话工厂和会话
[TestMethod]
public void ListAllData()
{
ISessionFactory sessionFactory;
Configuration dbConfig;
dbConfig = new Configuration();
dbConfig = dbConfig.Configure();
dbConfig.AddAssembly(typeof(Cars).Assembly);
sessionFactory = dbConfig.BuildSessionFactory();
using (ISession currentSession = sessionFactory.OpenSession())
{
var carList4 = currentSession.CreateCriteria(typeof(Cars)).List<Cars>();
var carList = currentSession.CreateCriteria<Cars>().List<Cars>();
var carList2 = currentSession.QueryOver<Cars>().List<Cars>();
var carList3 = currentSession.Query<Cars>().ToList<Cars>();
Assert.IsNotNull(carList);
Assert.IsTrue(carList.Count > 0);
}
}
但是所有 carList 变量都是空列表 - 我不知道我可能做错了什么...... - 没有抛出异常并且......我真的不知道出了什么问题(是的- 数据库中有数据)
提前致谢!
我终于明白我做错了什么。显然 NHibernate 总是 需要一个 xml "file" mo 无论如何。
这就是为什么在初始化代码中,我不得不使用
dbConfig.AddInputStream(
HbmSerializer.Default.Serialize(
typeof(Cars).Assembly));
而不是
dbConfig.AddAssembly(typeof(Carros).Assembly);
最后,我刚刚了解到 NHibernate 中的每个 class 都需要一个主键 - 这就是为什么我还必须更改 Cars class 以便
[Property(Name = "fHash")]
public virtual string fHash { get; set; }
成为
[NHibernate.Mapping.Attributes.Id(Name = "fHash")]
public virtual string fHash { get; set; }
我开始使用 NHibernate,但我有点不知所措。我只是想用尽可能少的代码来映射一个简单的 table 并查询它的所有成员。
我知道我应该从 xml 映射开始,但是,相反,我正在尝试使用属性映射(感觉比流畅更干净、更有效率,比 xml 更容易维护)
我的 class - 映射一个名为 "cars" 的 table 是这样的:
[Class(NameType = typeof(Cars),
Lazy = true,
Table = "Cars")]
public class Cars
{
[Property(Column = "Prefix")]
public virtual int Prefix { get; set; }
[Property(Column = "Status")]
public virtual int Status { get; set; }
[Property(Column = "Ip")]
public virtual string Ip { get; set; }
[Property(Column = "Port")]
public virtual int Port { get; set; }
[Property(Column = "CommStatus")]
public virtual int? CommStatus { get; set; }
[Property(Column = "TimeToRetry")]
public virtual DateTime? TimeToRetry { get; set; }
[Property(Column = "dsc")]
public virtual string dsc { get; set; }
[Property(Column = "Company")]
public virtual int Company { get; set; }
}
我的 hibernate.cfg.xml 配置文件是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">Server=.;Initial Catalog=TestDatabase;User Id=sa;Password=somethingelse!@#$;</property>
</session-factory>
</hibernate-configuration>
最后,我将以尽可能小的方式启动会话工厂和会话
[TestMethod]
public void ListAllData()
{
ISessionFactory sessionFactory;
Configuration dbConfig;
dbConfig = new Configuration();
dbConfig = dbConfig.Configure();
dbConfig.AddAssembly(typeof(Cars).Assembly);
sessionFactory = dbConfig.BuildSessionFactory();
using (ISession currentSession = sessionFactory.OpenSession())
{
var carList4 = currentSession.CreateCriteria(typeof(Cars)).List<Cars>();
var carList = currentSession.CreateCriteria<Cars>().List<Cars>();
var carList2 = currentSession.QueryOver<Cars>().List<Cars>();
var carList3 = currentSession.Query<Cars>().ToList<Cars>();
Assert.IsNotNull(carList);
Assert.IsTrue(carList.Count > 0);
}
}
但是所有 carList 变量都是空列表 - 我不知道我可能做错了什么...... - 没有抛出异常并且......我真的不知道出了什么问题(是的- 数据库中有数据)
提前致谢!
我终于明白我做错了什么。显然 NHibernate 总是 需要一个 xml "file" mo 无论如何。
这就是为什么在初始化代码中,我不得不使用
dbConfig.AddInputStream(
HbmSerializer.Default.Serialize(
typeof(Cars).Assembly));
而不是
dbConfig.AddAssembly(typeof(Carros).Assembly);
最后,我刚刚了解到 NHibernate 中的每个 class 都需要一个主键 - 这就是为什么我还必须更改 Cars class 以便
[Property(Name = "fHash")]
public virtual string fHash { get; set; }
成为
[NHibernate.Mapping.Attributes.Id(Name = "fHash")]
public virtual string fHash { get; set; }