2014-01-31 7 views
0

Я использую драйвер Devart Postgres в качестве провайдера Ado.net с NHibernate. Поскольку NHibernate не поддерживает драйвер Devart Postgres, я написал собственный класс драйвера на основе ReflectionBasedDriver. Вот код:Невозможно загрузить пользовательский поставщик ADO.NET для NHibernate

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 в качестве ссылки в моем решении и установить свойство Copy Local 'в 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." 

Что мне не хватает? У меня есть проблема, устраняющая эту проблему часами без особого успеха. Пожалуйста помоги!

+0

Это не '<свойство name =" connection.driver_class "> PostgresDriver.DbDriver.DevartPgDriver, Devart.Data' Что представляет собой ваш класс 'PostgresDriver.DbDriver.DevartPgDriver' в? – Rippo

+0

В сборке PostgresDriver. – aparajithanv

+0

Ваш пользовательский класс 'PostgresDriver.DbDriver.DevartPgDriver' в сборке под названием PostgresDriver (уведомление я сказал, что ваш пользовательский класс?) – Rippo

ответ

0

После нескольких часов проб и ошибок я был в состоянии решить эту проблему:

Вместо:

public DevartPgDriver() 
     : base(
     "Devart.Data.PostgreSql", 
     "Devart.Data.PostgreSql.PgSqlConnection", 
     "Devart.Data.PostgreSql.PgSqlCommand") 
    { 
    } 

Это должно было быть:

public DevartPgDriver() 
     : base(
     "Devart.Data.PostgreSql", 
     "Devart.Data.PostgreSql", 
     "PgSqlConnection", 
     "PgSqlCommand") 
    { 
    } 

Я также добавил nhProperties.Add(NHibernate.Cfg.Environment.Hbm2ddlKeyWords, "none"); в конфигурация nHibernate. Спасибо Rippo за направление.