2011-11-01 183 views
2

我創建了一個小應用程序,其中使用了Fluent Nhibernate。應用程序在Windows上運行良好,但在Mono中發生異常。無法從Mono中的NHibernate.Driver.MySqlDataDriver創建驅動程序

---> 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。單聲道不完全支持流利的NHibernate嗎?

回答

2

從我的經驗來看,流利的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); 
} 
+0

我試着在GAC中安裝它,但它不工作。我會嘗試大寫名字。這可能是Linux區分大小寫的原因。 – Sharique

+1

感謝哥們。這是大小寫敏感性問題的原因。我將文件名更改爲MySql.Data.dll,它可以工作。如果MySql.Data.dll位於應用程序的bin文件夾中,它也可以工作。 – Sharique

+0

謝謝@Sharique,我從'mysql.data.dll'通過'Mysql.data.dll'和'Mysql.Data.dll'直到你的'MySql.Data.dll'最終工作。 – domsom

相關問題