Unable to load dotConnect ADO.NET provider for NHibernate

Unable to load dotConnect ADO.NET provider for NHibernate

Postby aparajithanv » Fri 31 Jan 2014 14:23

I am using Devart Postgres driver as the Ado.net provider with NHibernate. Since NHibernate does not support Devart Postgres driver, I wrote a custom driver class based on ReflectionBasedDriver. Here is the code:

Code: Select all
namespace PostgresDriver.DbDriver
{
    class DevartPgDriver : ReflectionBasedDriver
    {
        public DevartPgDriver()
            : base(
            //"Devart.Data.PostgreSql",
            "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;
        }
    }
}


I have added Devart.Data and Devart.Data.PostgreSql DLLs as references in my solution and set 'Copy Local' property to True. I have also added the following section in App.Config:

Code: Select all
      <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>


Here is my hibernate.cfg.xml:

Code: Select all
    <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>


When I call
Code: Select all
sessionFactory = cfg.BuildSessionFactory();
I get the following error:
Code: Select all
"Could not load type 'PostgresDriver.DbDriver.DevartPgDriver' from assembly 'Devart.Data.PostgreSql, Version=7.2.80.0, Culture=neutral, PublicKeyToken=09af7300eec23701'."


When I try to instantiate the driver class `DevartPgDriver dr = new DevartPgDriver();` I get the error under the static members:

Code: Select all
    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."


What am I missing? I have troubleshooted this issue for hours without much success. Please help! :(
aparajithanv
 
Posts: 1
Joined: Fri 31 Jan 2014 14:19

Re: Unable to load dotConnect ADO.NET provider for NHibernate

Postby Shalex » Mon 03 Feb 2014 16:56

Please perform these steps:

1. Install the Professional edition of dotConnect for PostgreSQL, because only Professional includes the NHibernate runtime support: http://www.devart.com/dotconnect/postgresql/editions.html.

aparajithanv wrote:"The IDbCommand and IDbConnection implementation in the assembly {0} could not be found [..]"

This error says that your current edition of dotConnect for PostgreSQL is not Professional. You can check this via Tools > PostgreSQL > About menu of Visual Studio.

2. Replace

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

with

Code: Select all
        public DevartPgDriver()
            : base(
            "Devart.Data.PostgreSql",
            "Devart.Data.PostgreSql.NHibernate.NHibernatePgSqlConnection",
            "Devart.Data.PostgreSql.NHibernate.NHibernatePgSqlCommand")
      {
      }

in your DevartPgDriver class.

3. The "Could not load type 'PostgresDriver.DbDriver.DevartPgDriver' from assembly 'Devart.Data.PostgreSql, [...]" error is caused by this setting:

aparajithanv wrote:Here is my hibernate.cfg.xml:
Code: Select all
[...]
<property name="connection.driver_class">PostgresDriver.DbDriver.DevartPgDriver, Devart.Data.PostgreSql</property>
[...]

The Devart.Data.PostgreSql.dll assembly doesn't include the DevartPgDriver class. It is defined in your code, so you should specify the name of your assembly where the DevartPgDriver class resides:

Code: Select all
<property name="connection.driver_class">PostgresDriver.DbDriver.DevartPgDriver, YourAssemblyNameHere</property>


4. After this, you should be able to execute the following code:

Code: Select all
    Configuration cfg = new Configuration().AddAssembly(typeof(Program).Assembly); //xml mapping
    ISessionFactory sessionFactory = cfg.BuildSessionFactory(); // xml mapping

    ISession session = sessionFactory.OpenSession();

    IQuery query = session.CreateQuery("from MyMappedClass i");
    IList res = query.List();


We have just sent a test application to the e-mail address you specified in your forum profile. For creating the *.hbml model (which allows generating a code and mapping automatically) in the project, we used Entity Developer for NHibernate.
Shalex
Devart Team
 
Posts: 7654
Joined: Thu 14 Aug 2008 12:44


Return to dotConnect for PostgreSQL