在c#中连接nhibernate和Postgresql

本文关键字:Postgresql nhibernate 连接 | 更新日期: 2023-09-27 18:11:03

这是我第一次使用nhibernate,我遇到了从Postgresql数据库连接和检索数据的问题。代码没有给出错误,但也没有返回任何值。当我使用pgAdmin3时,我确实得到了数据。

AutoPersistenceModel model = AutoMap.Assembly(System.Reflection.Assembly.GetCallingAssembly())
    .Where(t => t.Namespace == "POCPostgresql.Model");
var configuration = Fluently.Configure()
    .Database(PostgreSQLConfiguration.Standard
    .ConnectionString(c => c
        .Host("server")
        .Port(5432)
        .Database("database")
        .Username("username")
        .Password("password")))
    .Mappings(m => m
        .AutoMappings.Add(model))
    .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
    .BuildSessionFactory();
    using (var session = configuration.OpenSession())
    {
        // Query all objects
        var completeList = session.CreateCriteria<Object>().List();
        Console.ReadLine();
    }

completelist变量是一个空列表。

有什么我忘了的吗?

编辑:此外,当将配置移动到app.config并对其进行不同的初始化时,结果是空列表

Configuration configuration = new Configuration();
configuration.Configure();
ApplicationCore.Instance.SessionFactory = configuration.BuildSessionFactory();
using (var session = ApplicationCore.Instance.SessionFactory.OpenSession())
{
    var completeList = session.CreateCriteria<Object>().List();
    Console.ReadLine();
}

编辑2:我想也许是服务器出于某种原因拒绝了我的查询,但我试过只使用npgsql查询,这很好。

NpgsqlConnection conn = new NpgsqlConnection("server=server;Port=5432;Database=database;User Id=username;Password=password;");
conn.Open();
string sql = "SELECT * FROM report LIMIT 100";
NpgsqlCommand command = new NpgsqlCommand(sql, conn);
NpgsqlDataReader dr = command.ExecuteReader();
while (dr.Read())
    Console.Write("{0}'t{1} 'n", dr[0], dr[1]);
conn.Close();
Console.ReadLine();

在c#中连接nhibernate和Postgresql

我已经解决了这个问题通过改变映射使用流畅映射和一切突然工作

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ReportDB>())

问题的关键(我可以看到)是传递给query的错误类型:

var completeList = session.CreateCriteria<Object>().List();

我们可以看到,我们请求 Object (传递为 <TEntity> ),这是c#内置的类型,几乎可以肯定的是NHibernate没有映射…

注意:NHibernate不太好的一面是-当查询未映射对象时-我们得到空结果而不是错误

那么,试着请求一些真正映射的对象:

var completeList = session.CreateCriteria<Employee>().List();