使用MySQL配置NHibernate出错,不和谐的解决方式
以前使用MySQL,只是简单的利用Connection,Command做一些小P测试程序,对MySQL的认识也只是停留在它是个数据库而已,跟SQL Server没有神马区别。
现在项目开发过程中,越来越依赖ORM、依赖注入,今天使用MySQL配置了一把,过程中出现了一点小小问题,主要原因就是:Spring不能初始化MySQL的数据库Provider。
我安装的MySQL版本是5.0.27
项目添加的MySQL驱动的版本是Assembly MySql.Data, Version 5.1.7.0
Spring相关配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database">
<!-- Referenced by main application context configuration file -->
<description>
Definitions for the NHibernate Objects.
</description>
<!-- Database and NHibernate Configuration -->
<db:provider id="DbProvider"
provider="MySql-5.0"
connectionString="Data Source=localhost;User Id=root;Password=root;database=moye"/>
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Meego.Moye.HibernateDAL.Mapping</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect" value="NHibernate.Dialect.MySQL5Dialect"/>
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
<entry key="hibernate.show_sql" value="false"/>
</dictionary>
</property>
</object>
<object id="HibernateTransactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
</objects>
按照项目分层的原则,类关系如图:
注入TeacherDao:
<object id="TeacherDao" type="Meego.Moye.HibernateDAL.MySQL.TeacherDaoHibernate,Meego.Moye.HibernateDAL.MySQL">
<property name="HibernateTemplate" ref="HibernateTemplate"/></object>
在Default.aspx页面中注入TeacherDao:
<object type="~/Default.aspx">
<property name="TeacherDao" ref="TeacherDao"></property>
</object>
页面中获取List<Teacher>列表:
IList<Teacher> teachers = this.teacherDao.GetTeachers();
项目部署到现在,基本已经搞定,为了简单,这里没有配置IBLL层和BLLImpl层。
跟以前配置ORM及依赖注入一样,可是程序会奇怪的报一个错误:
Error thrown by a dependency of object 'MySql-5.0' defined in 'assembly [Spring.Data, Version=1.1.2.20125, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml]' :Unsatisfied dependency expressed through constructor argument with index 2 of type [System.Type] :Could not convert constructor argument value [MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=5.0.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d] to required type [System.Type] :Cannot convert property value of type [System.String] to required type [System.Type] for property ''.
while resolving 'constructor argument with name dbmetadata' to '(inner object)' defined in 'assembly [Spring.Data, Version=1.1.2.20125, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml]'
主要原因是配置DbProvider时候,Spring不能初始化数据库Provider。
查看Spring支持数据库Provider:
名称 |
介绍 |
|
Microsoft SQL Server, provider V |
|
Microsoft SQL Server, provider V |
|
Microsoft SQL Server Compact Edition, provider V9.0.242.0 |
|
Microsoft SQL Server Compact Edition, provider V |
|
provider V1.0. |
|
provider V |
|
Oracle, Microsoft provider V |
|
Oracle, Oracle provider V2.102.2.20 |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
Postgresql provider |
|
Postgresql provider 1.98.1.0 beta 1 |
|
Postgresql provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
SQLite provider |
|
SQLite provider |
|
Sybase ASE provider for ASE 12.x |
|
Sybase ASE provider for ASE 15.x |
|
Sybase ADO.NET 2.0 provider for ASE 12.x and 15.x |
|
ODBC provider V1.0. |
|
ODBC provider V |
InterSystems.Data.CacheClient |
Caché provider Version |
具体请查看Spring.Net 官方文档 Chapter 19. DbProvider。
我的MySQL版本是5.1.7.0没有对应的版本,具体什么原因,在网站查找资料也没有发现解决方法,
没有办法我只好从MySQL的官方文档上下来了最新的MySQL-connector-net安装到机器上,重新启动网站,
测试已经没有问题。
难道是安装MySQL-connector-net时,重新配置了VS环境的问题?
本人就是爱折腾,接下来把MySQL-connector-net安装目录下的MySql.Data.dll拷贝出来,放到项目文件里,修改网站引用的程序集,
卸载MySQL-connector-net,测试网站,未果,还是报错。
最后修改DbProvider name属性:
<!-- Database and NHibernate Configuration -->
<db:provider id="DbProvider"
provider="OracleClient-2.0"
connectionString="Data Source=localhost;User Id=root;Password=root;database=moye"/>
测试正常。
有点无语,不过还是把mysql-connector-net安装上,算是一种合适的解决方式。
大家有没有遇到相同的问题,小弟对这其中的原理不是很清楚,希望知道的朋友帮忙解释一下,感谢。