2015-09-03 44 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();