2015-09-03 45 views
0

这是我第一次使用nhibernate,并且遇到连接和从Postgresql数据库检索数据时出现问题的情况。该代码不会给出错误,但也不会返回任何值。当我使用pgAdmin3时,我确实得到了数据。将nhibernate连接到C中的Postgresql#

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(); 
    } 

完整列表变量是一个空列表。

有什么我忘记了吗?

编辑: 此外,当移动的配置,在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(); 

回答

1

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

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

这里的要点(我可以看到)是在错误的类型传递到查询:

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

正如我们所看到的,我们要求Object(如<TEntity>通过)这是C#内置的类型,几乎肯定NOT MAPPED通过NHibernate映射...

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

所以,只是尝试问一些真正映射对象:

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