从 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; }