代码之家  ›  专栏  ›  技术社区  ›  Mark

用C语言将nhibernate连接到Postgresql#

  •  3
  • Mark  · 技术社区  · 10 年前

    这是我第一次使用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变量是空列表。

    有什么我忘了吗?

    编辑: 将配置移动到应用程序时也是如此。配置并以不同方式初始化它会导致一个空列表

    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();
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   Mark    10 年前

    我已经通过将映射更改为使用流畅的映射解决了这个问题,一切都突然奏效了

    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ReportDB>())
    
        2
  •  0
  •   Radim Köhler user2134822    10 年前

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

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

    正如我们所见,我们要求 Object (以身份通过 <TEntity> ) 这是C#内置类型,几乎可以肯定不是通过NHibernate映射映射的。。。

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

    因此,只需尝试询问一些真正映射的对象:

    var completeList = session.CreateCriteria<Employee>().List();
    
    推荐文章