postgresql

时间:2018-01-15 14:08:10

标签: .net postgresql nhibernate

有人知道如何将NHibernate中的字符串(通过.hbm映射)映射到Postgresql的“citext”类型吗?

我尝试像这样设置sql-type =“citext”:

<property name="UserName">
    <column name="username" sql-type="citext" />
</property>

但是这不起作用 - 当通过此列查询数据库时,仍然会进行区分大小写的比较。

1 个答案:

答案 0 :(得分:0)

经过一段时间的努力,我终于找到了如何做到这一点的方法。 我通过派生NHibernate.Driver.NpgsqlDriver并覆盖InitializeParameter方法创建了自己的Postgresql驱动程序。然后我通过hibernate.cfg.xml文件配置这个驱动程序。

我正在使用Npgsql包访问Postgresql,所以想法是在需要时用Citext覆盖NpgsqlDbType:

public class CitextPostgreSqlDriver : NpgsqlDriver
{
    protected override void InitializeParameter(DbParameter dbParam, string name, SqlType sqlType)
    {
        base.InitializeParameter(dbParam, name, sqlType);

        var dbType = sqlType?.DbType;
        var npgsqlParam = dbParam as Npgsql.NpgsqlParameter;
        if (npgsqlParam != null && (dbType == System.Data.DbType.String || dbType == System.Data.DbType.AnsiString))
        {
            npgsqlParam.ResetDbType();
            npgsqlParam.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Citext;
        }
    }
}