我创建了一个小应用程序,我正在使用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吗?
答案 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);
}