最近准备着手在Visual Studio2010和.Net 4环境下进行一些Silverlight的项目开发,由于公司使用Oracle 10g数据库系统,因此我们需要有一个额外的ADO.NET Entity
Framework for Oracle Provider。
Microsoft在官方网站上向我们免费提供了一个叫做EFOracleProvider的Sample用于在Visual Studio中创建一个连接到Oracle数据库的EDMX实体文件,但是源代码是在Visual Studio 2008 SP1 (.Net 3.5 SP1) 的环境下编译的。为了能够在Visual Studio 2010(.Net 4)的环境中使用,我们需要将这个DLL安装到CLR 4.0的环境中。之前由于错误的将该dll注册到.Net 3.5的运行时环境CLR 2.0中,因此在编译项目时一直提示"指定的数据提供程序在配置文件中找不到,或者无效",也无法通过生成的实体类读取到数据库中的数据。
下面是我在Visual Studio 2010中解决该问题的具体方法:
1. 下载项目源代码,并使用Visual Studio 2010打开解决方案。同时在Visual Studio 2010的项目属性页中将项目的Target Framework 改为4.0,删除生成事件中的“后期生成事件命令行”。(原命令行用于将dll注册到.net 3.5 的运行时),重新生成EFOracleProvider.dll。
在安装了Visual Studio 2010或者.Net 4 SDK的情况下,我们有一个新的用于.Net 4的gacutil.exe位于C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\,运行gacutil.exe /?命令就能看到类似“Microsoft (R) .NET Global Assembly Cache Utility. Version *.*.*.*”这样的工具版本信息。注意,在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\目录下也有一个gacutil.exe工具,但是这个是.Net 3.5版本的。
2. 在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\目录下运行cmd,输入如下命令行注册:
gacutil.exe -if EFOracleProvider.dll
3. 将EFOracleProvider的信息在.Net 4的Machine.config文件中进行声明。打开%windir%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config,Ctrl+F找到
通过以上3个步骤之后,EFOracleProvider就已经成功的在我们的计算机上安装了,此时,我们已经能够通过EFOracleProvider来正常的访问Oracle数据库了。如果我们需要为Oracle数据库表生成EDMX实体集,可以继续按照如下的步骤:
4. 在%windir%\Microsoft.NET\Framework\v4.0.30319\目录下运行cmd,输入如下命令行生成数据库实体文件:
edmgen.exe /provider:EFOracleProvider /mode:fullgeneration /connectionstring:"data source=XE;user id=edmuser;password=123456" /project:NorthwindEFModel
当运行结束之后,这将为我们生成*.csdl, *.msl, *.ObjectLayer.cs, *.ssdl, *.Views.cs一共5个文件。
5. 使用记事本打开*.ssdl,查找并替换其中的store:Schema="dbo"和Schema="dbo"为空。
6. 从http://archive.msdn.microsoft.com/EdmGen2下载EdmGen2.exe工具。使用如下命令行生成EDMX实体文件。
EdmGen2.exe /toedmx *.csdl *.ssdl *.msl
至此,我们已经完成了从Oracle数据库生成EDMX实体文件并使用EFOracleProvider提供的功能访问其中的数据这整个过程。
目前Oracle官方发布的最新版本ODAC组件已经可以支持ADO.NET EF和Linq To Entities,建议同学们使用ODAC来代替EFOracleProvider访问Oracle 数据库,毕竟EFOracleProvider还是有太多的局限性。
参考:
Sample Entity Framework Provider for Oracle
http://code.msdn.microsoft.com/EFOracleProvider
.NET Framework 4.0 中如何把一个程序部署到全局应用缓存(GAC)
http://www.cnblogs.com/ghj1976/archive/2010/04/26/1721179.html
动刀EFOracleProvider,使其支持char、timestamp(x)等类型
http://blog.csdn.net/fzzsh/archive/2010/06/30/5703744.aspx
Using EF Oracle Sample Provider with EDM Designer
http://blogs.msdn.com/b/jkowalski/archive/2008/10/24/using-ef-oracle-sample-provider-with-edm-designer.aspx
EdmGen2.exe
http://archive.msdn.microsoft.com/EdmGen2