接触ADO.NET Entityframework有一段时间了,在实际项目的应用中有一个最大的问题就是M$没有对多种数据库提供支持,在笔者最近碰到的一个网站项目中,公司要求使用MYSQL,到处找MYSQL的EFProvider,发现Devart dotConnect还不错,提供了比较完善的解决方案,只是在自动从数据库提取物理模型中存在编码的问题,到目前还没有找到解决办法,但是Devart dotConnect是收费的,专业版得上千美刀,有Free Edition,但是不提供对EntityFramwork的支持。无奈,寻找其他的解决方案。
偶然间在一份SUN的文档中有提到在未来版本中对AEF的支持,到MYSQL.com下载最新的MySql.Data.dll为5.2.5版,并没有对AEF提供支持,再到源码服务器,惊喜得看到多了一个MySql.Data.Entity项目,MySql.Data也已经到了5.3.0版。立刻下载。
下载后先编译MySQL.Data,并签名程序集,MySQL.Data.Entity引用MySQL.Data,编译并签名,取得MySQL.Data.Entity的PublicKeyToken,修改MySQL.Data中类MySqlClientFactory的IServiceProvider.GetService方法相关的代码,将Provider类型指向刚才编译好的MySQL.Data.Entity程序集中的MySql.Data.MySqlClient.MySqlProviderServices类,修改后大概就像下面的样子。
privateFieldInfoMySqlDbProviderServicesInstance
{
get
{
if(mySqlDbProviderServicesInstance==null)
{
//stringfullName=Assembly.GetExecutingAssembly().FullName;
//fullName=fullName.Replace("MySql.Data","MySql.Data.Entity");
stringfullName="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity,Version=5.3.0.0,Culture=neutral,PublicKeyToken=b3fe30829fc170e4";
TypeproviderServicesType=Type.GetType(fullName,false);
mySqlDbProviderServicesInstance=providerServicesType.GetField("Instance",
BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
}
returnmySqlDbProviderServicesInstance;
}
}
objectIServiceProvider.GetService(TypeserviceType)
{
//DbProviderServicesistheonlyserviceweofferuprightnow
if(serviceType!=DbServicesType)returnnull;
if(MySqlDbProviderServicesInstance==null)returnnull;
returnMySqlDbProviderServicesInstance.GetValue(null);
}
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!