从NHibernate开始

时间:2015-08-27 12:28:36

标签: c# nhibernate attributes nhibernate-mapping

我开始使用NHibernate而且我有点迷失了。我只是尝试用最小的代码来映​​射一个简单的表并查询它的所有成员。

我知道我应该开始使用xml映射,但是,我尝试使用属性映射(感觉比xml更流畅,更易于维护,感觉更清晰,更高效)

我的班级 - 映射名为&#34的表格;汽车"是这样的:

[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变量都是空列表 - 我不知道我可能做错了什么...... - 没有例外被抛出......我真的不知道出了什么问题(是的 - 数据库中有数据)

提前致谢!

1 个答案:

答案 0 :(得分:1)

我终于得到了我做错的事。显然NHibernate 总是需要一个xml&#34;文件&#34;莫如何。

这就是为什么在初始化代码中我必须使用

        dbConfig.AddInputStream(
            HbmSerializer.Default.Serialize(
                typeof(Cars).Assembly));

而不是

        dbConfig.AddAssembly(typeof(Carros).Assembly);

Finnaly,我刚刚得知NHibernate中的每个班级都需要一个主键 - 这也是我为什么还要更改Cars类的原因

    [Property(Name = "fHash")]
    public virtual string fHash { get; set; }

成了

    [NHibernate.Mapping.Attributes.Id(Name = "fHash")]
    public virtual string fHash { get; set; }