我使用 Devart Postgres 驱动程序作为 NHibernate 的 Ado.net 提供程序。由于 NHibernate 不支持 Devart Postgres 驱动,所以我写了一个基于 ReflectionBasedDriver 的自定义驱动类。这是代码:
namespace PostgresDriver.DbDriver
{
class DevartPgDriver : ReflectionBasedDriver
{
public DevartPgDriver()
: base(
"Devart.Data.PostgreSql",
"Devart.Data.PostgreSql.PgSqlConnection",
"Devart.Data.PostgreSql.PgSqlCommand")
{
}
public override string NamedPrefix
{
get { return ":"; }
}
public override bool UseNamedPrefixInParameter
{
get { return true; }
}
public override bool UseNamedPrefixInSql
{
get { return true; }
}
public override bool SupportsMultipleOpenReaders
{
get { return false; }
}
protected override bool SupportsPreparingCommands
{
get { return true; }
}
public override IResultSetsCommand GetResultSetsCommand(NHibernate.Engine.ISessionImplementor session)
{
return new BasicResultSetsCommand(session);
}
public override bool SupportsMultipleQueries
{
get { return true; }
}
protected override void InitializeParameter(IDbDataParameter dbParam, string name, NHibernate.SqlTypes.SqlType sqlType)
{
base.InitializeParameter(dbParam, name, sqlType);
// Since the .NET currency type has 4 decimal places, we use a decimal type in PostgreSQL instead of its native 2 decimal currency type.
if (sqlType.DbType == DbType.Currency)
dbParam.DbType = DbType.Decimal;
}
}
}
我在我的解决方案中添加了 Devart.Data 和 Devart.Data.PostgreSql DLL 作为引用,并将“复制本地”属性设置为 True。我还在 App.Config 中添加了以下部分:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="Devart.Data.PostgreSql"
fullName="Devart.Data.PostgreSql, Version=7.2.80.0, Culture=neutral, PublicKeyToken=09af7300eec23701">
</qualifyAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="Devart.Data"
fullName="Devart.Data, Version=5.0.872.0, Culture=neutral, PublicKeyToken=09af7300eec23701">
</qualifyAssembly>
</assemblyBinding>
</runtime>
这是我的 hibernate.cfg.xml:
<session-factory name="NHSessionFactory">
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">PostgresDriver.DbDriver.DevartPgDriver, Devart.Data.PostgreSql</property>
<property name="dialect">NHibernate.Dialect.PostgreSQL82Dialect</property>
<property name="connection.connection_string">User Id=***;Password=***;Host=localhost;Port=5433;Database=***;</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property
</session-factory>
当我打电话时,sessionFactory = cfg.BuildSessionFactory();
我收到以下错误:"Could not load type 'PostgresDriver.DbDriver.DevartPgDriver' from assembly 'Devart.Data.PostgreSql, Version=7.2.80.0, Culture=neutral, PublicKeyToken=09af7300eec23701'."
当我尝试实例化驱动程序类时DevartPgDriver dr = new DevartPgDriver();
,我在静态成员下得到错误:
NHibernate.Driver.ReflectionBasedDriver.ReflectionTypedProviderExceptionMessageTemplate
"The IDbCommand and IDbConnection implementation in the assembly {0} could not be found. Ensure that the assembly {0} is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly."
我错过了什么?我已经解决了这个问题几个小时,但没有取得多大成功。请帮忙!