无法从Mono中的NHibernate.Driver.MySqlDataDriver创建驱动程序

时间:2011-11-01 06:01:00

标签: fluent-nhibernate mono

我创建了一个小应用程序,我正在使用Fluent Nhibernate。应用程序在Windows上运行良好,但在Mono中提供异常。

    ---> NHibernate.HibernateException: Could not create the driver from
NHibernate.Driver.MySqlDataDriver, NHibernate, Version=3.1.0.4000,
Culture=neutral, PublicKeyToken=aa95f207798dfdb4. --->
System.Reflection.TargetInvocationException: Exception has been thrown
by the target of an invocation. --->
System.Configuration.ConfigurationErrorsException: Failed to find or
load the registered .Net Framework Data Provider
'MySql.Data.MySqlClient'.
 at System.Data.Common.DbProviderFactories.GetFactory (System.String
providerInvariantName) [0x00000] in <filename unknown>:0 

我正在使用Kubuntu 11.10和Mono 2.10.5。流畅的NHibernate版本是1.2。 Mono不完全支持Fluent NHibernate吗?

1 个答案:

答案 0 :(得分:2)

根据我的经验,Fluent NHibernate在Mono上运行良好。

我实际上昨天才开始工作。不幸的是,我没有在我面前的代码,但我会给你一些提示,直到我发布工作代码...

我假设你已经下载了 MySql.Data.dll 并在你的Mono项目中引用了它。需要注意的是,下载后该文件通常称为 MySQL.Data.dll 。它应该重命名为 MySql.Data.dll (请注意“ Q ”和“ L ”的案例更改。)

然后,必须在 GAC 中注册该库才能使用Mono。简单地将文件放在相对路径中并引用它不起作用(我不完全确定原因)。更多信息是here

gacutil /i MySql.Data.dll

如果它仍然不起作用,您可能需要编写一个源自 NHibernate.Driver.ReflectionBasedDriver 的驱动程序。这是一段非常小的代码,稍后我会发布它。

编辑:这是我正在使用的MySQL驱动程序。

public class MySqlDriver : NHibernate.Driver.ReflectionBasedDriver
{
    public MySqlDriver() : base(
        "MySql.Data, Version=6.4.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d",
        "MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.4.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d",
        "MySql.Data.MySqlClient.MySqlCommand, MySql.Data, Version=6.4.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
    ) { }

    public override bool UseNamedPrefixInParameter
    {
        get { return true; }
    }

    public override bool UseNamedPrefixInSql
    {
        get { return true; }
    }

    public override string NamedPrefix
    {
        get { return "@"; }
    }

    public override bool SupportsMultipleOpenReaders
    {
        get { return false; }
    }
}

...和会话工厂函数

private string _ConnectionString = "";

private ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure().Database(
        MySQLConfiguration.Standard.Driver<MySqlDriver>().ConnectionString(_ConnectionString)
    ).Mappings(
        m => m.FluentMappings.AddFromAssemblyOf<YourType>()
    ).ExposeConfiguration(
        BuildSchema
    ).BuildSessionFactory();
}

private void BuildSchema(Configuration config)
{
    //new SchemaExport(config).Create(false, true);
    new SchemaUpdate(config).Execute(false, true);
}