无法实例化连接提供程序:NHibernate.Driver.MySqlDataDriver

时间:2014-02-23 18:42:49

标签: c# mysql asp.net-mvc nhibernate

我正在使用NHibernate创建一个简单的Web项目,每当我尝试构建sessionfactory时,我都会遇到此错误。

导致异常的行是

ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

有类似问题的人似乎通过引用我已经完成的Mysql.data.dll解决了这些问题,并检查了dll是否在我的bin文件夹中。

我怀疑错误在于我的hibernate.cfg.xml,它看起来像这样

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
<property name="connection.provider">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>
<property name="connection.connection_string">connectionstring</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<mapping assembly="Mcgvd" />
</session-factory>
</hibernate-configuration>

我遵循的教程使这个项目使用helperclass来创建看起来像这样的sessionfactory

public sealed class NHibernateHelper
{
    private const string CurrentSessionKey = "nhibernate.current_session";
    private static readonly ISessionFactory sessionFactory;

    static NHibernateHelper()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
    }

    public static ISession GetCurrentSession()
    {
        HttpContext context = HttpContext.Current;
        ISession currentSession = context.Items[CurrentSessionKey] as ISession;

        if (currentSession == null)
        {
            currentSession = sessionFactory.OpenSession();
            context.Items[CurrentSessionKey] = currentSession;
        }

        return currentSession;
    }

    public static void CloseSession()
    {
        HttpContext context = HttpContext.Current;
        ISession currentSession = context.Items[CurrentSessionKey] as ISession;

        if (currentSession == null)
        {
            // No current session
            return;
        }

        currentSession.Close();
        context.Items.Remove(CurrentSessionKey);
    }

    public static void CloseSessionFactory()
    {
        if (sessionFactory != null)
        {
            sessionFactory.Close();
        }
    }
}

hibernate.cfg.xml和hibernate.hbm.xml都位于我项目的根目录。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您的配置错误。

<property name="connection.provider">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>

您已经为连接提供程序指定了驱动程序,并且在您显然使用MySQL时指定了SQL Server CE驱动程序。尝试:

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>

答案 1 :(得分:0)

除了故障Jamie发现我必须更改connection.provider属性,其中我出于某种原因放了mysqldatadriver。

这是我最终的工作配置。

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.connection_string">connectionstring</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<mapping assembly="Mcgvd" />
</session-factory>
</hibernate-configuration>