近期初次接触postgresql数据库,并要在项目中使用NHibernate进行访问和持久化,在这一过程中遇到了一些问题,主要是配置和id自增长的问题,现在将解决后的结果进行整理,以便后续参照
首先,在使用postgresql时需要在nuget中安装Npgsql,或者自己下载postgresql的包,然后引入Npgsql.dll
1、hibernate.cfg.xml配置
<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
//此处我的登录名称为postgres,密码为空
<property name="connection.connection_string">
Server=localhost;Database=database;User ID=postgres;Password=;
</property>
<property name="dialect">NHibernate.Dialect.PostgreSQL82Dialect</property>
</session-factory>
</hibernate-configuration>
2、配置generator,使得id自增长,采用sequence方式,类似oracle。下面以Country类为例进行配置,Country类的定义如下:
public class Country
{
public virtual int Id { get; set; }
public virtual string CountryName { get; set; }
public virtual string CountryCode { get; set; }
}
Country类mapping时,id自增长配置,Country.hbm.xml内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="LS.SGYC.Domain.BusinessObjects" assembly="LS.SGYC.Domain">
<class name="LS.SGYC.Domain.BusinessObjects.Country, LS.SGYC.Domain" table="country" lazy="true">
<id name="Id" column="id">
<generator class="sequence">
<param name="sequence">country_id_seq</param>
</generator>
</id>
<property name="CountryName" column="countryname" />
<property name="CountryCode" column="countrycode" />
</class>
</hibernate-mapping>
关键在于sequence的名称country_id_seq,需要在postgresql数据库中新增一个序列,如下图:
PS:后来发现了postgresql中有一个Serial的字段类型,将主键设置成Serial,则无需手动创建sequence,pg数据库为自动为你生成,可以省去一部分手工操作,类似于MS SQL中的设置为自增
这里只需要设置递增量和当前值即可,其他的值系统会自动设置,这样所有的配置已经设置完成
GOOD LUCK!