Using EF Oracle Sample Provider with EDM Designer (from msdn)
Many people are asking if it is possible to use EFOracleProvider with EDM Designer in Visual Studio 2008 SP1. The answer is yes, but because the sample doesn‘t include a DDEX provider required for VS integration, there are certain steps that have to be run manually.
I‘ve compiled a step-by-step guide for those interested in trying this out (this assumes NorthwindEF sample database installed according to instructions included with the sample, but it should be straightforward to adjust it to your own setup)
PART 1 : INSTALLING ORACLE SAMPLE PROVIDER
1. Download and unzip EFOracleSampleProvider.zip from http://code.msdn.com/EFOracleProvider
2. Follow instructions in the README.txt to set up a sample database.
3. Open elevated Visual Studio instance. Build the sample project.
4. Open elevated command prompt and open machine.config using notepad:
notepad %WINDIR%\Microsoft.NET\Framework\v2.0.50727\config\machine.config
5. Find <DbProviderFactories> section and add EFOracleProvider entry:
<add name="EF Oracle Data Provider" invariant="EFOracleProvider" description="EF Provider for Oracle testing" type="EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b"/>
6. The completed system.data section has to look similar to this:
<system.data> <DbProviderFactories> <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="EF Oracle Data Provider" invariant="EFOracleProvider" description="EF Provider for Oracle testing" type="EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b"/> <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </DbProviderFactories> </system.data>
PART 2: GENERATING MODEL FROM ORACLE DATABASE
7. Create a new project in VS. For simplicity let‘s create a console application
8. Open elevated command prompt. Enter the directory that contains the newly created project and run the following command:
%WINDIR%\Microsoft.NET\Framework\v3.5\edmgen.exe /provider:EFOracleProvider /mode:fullgeneration /connectionstring:"data source=XE;user id=edmuser;password=123456" /project:NorthwindEFModel
The output should be:
Microsoft (R) EdmGen version 3.5.0.0 Copyright (C) 2008 Microsoft Corporation. All rights reserved. Loading database information... warning 6005: The data type ‘timestamp(9)‘ is not supported, the column ‘OrderDate‘ in table ‘dbo.Orders‘ was excluded. warning 6005: The data type ‘timestamp(3)‘ is not supported, the column ‘RequiredDate‘ in table ‘dbo.Orders‘ was excluded. Writing ssdl file... Creating conceptual layer from storage layer... Writing msl file... Writing csdl file... Writing object layer file... Writing views file... Generation Complete -- 0 errors, 2 warnings
9. This will create a bunch of NorthwindEFModel.* files for you.
10. Open Northwind.ssdl file in a text editor and replace all instances of Schema="dbo" with empty string (this is needed because tables in the sample Oracle database don‘t use a schema)
11. In order to use generated model in the EF Ddesigner, we have to create NorthwindEFModel.edmx file. This can be done manually (just copy/paste contents of individual files into an empty EDMX as indicated by the comments) or by using EdmGen2 tool from Code Gallery:
C:\Path\To\EdmGen2.exe /toedmx NorthwindEFModel.csdl NorthwindEFModel.ssdl NorthwindEFModel.msl
12. This will create NorthwindEFModel.edmx, which we can add to the project in VS.
13. At this point you can now delete the following files generated by EdmGen.exe, which won‘t be necessary:
- NorthwindEFModel.csdl
- NorthwindEFModel.ssdl
- NorthwindEFModel.msl
- NorthwindEFModel.ObjectLayer.cs
- NorthwindEFModel.Views.cs
PART 3: TESTING GENERATED MODEL
14. The only remaining thing to do is to add App.config file with connection string for our Oracle database:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="NorthwindEFModelContext" connectionString="provider=EFOracleProvider; metadata=res://*/NorthwindEFModel.csdl|res://*/NorthwindEFModel.ssdl|res://*/NorthwindEFModel.msl; Provider Connection String=‘data source=XE;user id=edmuser;password=123456‘" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
15. We can now try out our model by running a sample LINQ to Entities query:
using (NorthwindEFModelContext context = new NorthwindEFModelContext()) { foreach (var c in context.Customers.Where(c=>c.City == "Seattle")) { Console.WriteLine(c.CompanyName); } }
本人用我的poor英文水平,简单的翻译了一下(供参考):
许多人问它是否可能与 EDM 设计器在 Visual Studio 2008 SP1 中使用EFOracleProvider 。答案是肯定的但因为该示例不包括 VS 集成所需的 DDEX 提供程序,有某些必须手动运行的步骤。
我总结了一个分步指南,对于那些有兴趣尝试这 (这是假设 NorthwindEF 示例数据库根据示例,附带的说明,安装,但它应该很简单,调整到您自己的安装程序)
第 1 部分: 安装 ORACLE 示例提供程序
1.下载并解压缩 EFOracleSampleProvider.zip 从http://code.msdn.com/EFOracleProvider
2.按照说明在 README.txt 中的设置一个示例数据库。
3.开放提升的 Visual Studio 实例。生成示例项目。
4.打开提升的命令提示符并 machine.config 使用记事本打开:
notepad %WINDIR%\Microsoft.NET\Framework\v2.0.50727\config\machine.config
5.找到 <DbProviderFactories> 部分并添加 EFOracleProvider 条目:
<add name="EF Oracle Data Provider" invariant="EFOracleProvider" description="EF Provider for Oracle testing" type="EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b"/>
6.已完成的 system.data 部分有看上去类似这样:
<system.data> <DbProviderFactories> <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add name="EF Oracle Data Provider" invariant="EFOracleProvider" description="EF Provider for Oracle testing" type="EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b"/> <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </DbProviderFactories> </system.data>
第 2 部分: 从 ORACLE 数据库生成模型
7.在 VS 中创建一个新的项目。为简单起见,让我们创建一个控制台应用程序
8.打开提升的命令提示符。输入包含新创建的项目的目录,然后运行以下命令:
%WINDIR%\Microsoft.NET\Framework\v3.5\edmgen.exe /provider:EFOracleProvider /mode:fullgeneration /connectionstring:"data source=XE;user id=edmuser;password=123456" /project:NorthwindEFModel
输出应该是:
Microsoft (R) EdmGen version 3.5.0.0 Copyright (C) 2008 Microsoft Corporation. All rights reserved. Loading database information... warning 6005: The data type ‘timestamp(9)‘ is not supported, the column ‘OrderDate‘ in table ‘dbo.Orders‘ was excluded. warning 6005: The data type ‘timestamp(3)‘ is not supported, the column ‘RequiredDate‘ in table ‘dbo.Orders‘ was excluded. Writing ssdl file... Creating conceptual layer from storage layer... Writing msl file... Writing csdl file... Writing object layer file... Writing views file... Generation Complete -- 0 errors, 2 warnings
9.这将为您创建 NorthwindEFModel.* 文件一的束。
10.在文本编辑器中打开 Northwind.ssdl 文件并替换所有实例的架构 ="dbo"与空字符串 (这需要,因为示例 Oracle 数据库中的表不使用架构)
11.对在 EF Ddesigner 中使用生成的模型,我们必须创建 NorthwindEFModel.edmx 文件。这可以手动完成 (只复制/粘贴内容成空 EDMX 如评论所示的单个文件) 或使用EdmGen2 工具从代码库:
C:\Path\To\EdmGen2.exe /toedmx NorthwindEFModel.csdl NorthwindEFModel.ssdl NorthwindEFModel.msl
12.这将创建 NorthwindEFModel.edmx,我们可以添加到项目中,VS。
13.在这一点,你现在可以删除生成 EdmGen.exe,这不会是必需的以下文件:
- NorthwindEFModel.csdl
- NorthwindEFModel.ssdl
- NorthwindEFModel.msl
- NorthwindEFModel.ObjectLayer.cs
- NorthwindEFModel.Views.cs
第 3 部分: 测试生成的模型
14.剩下的唯一要做是我们的 Oracle 数据库与连接字符串 App.config 文件中添加:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="NorthwindEFModelContext" connectionString="provider=EFOracleProvider; metadata=res://*/NorthwindEFModel.csdl|res://*/NorthwindEFModel.ssdl|res://*/NorthwindEFModel.msl; Provider Connection String=‘data source=XE;user id=edmuser;password=123456‘" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
15.我们现在可以尝试我们的模型通过对实体查询运行 LINQ 示例:
using (NorthwindEFModelContext context = new NorthwindEFModelContext()) { foreach (var c in context.Customers.Where(c=>c.City == "Seattle")) { Console.WriteLine(c.CompanyName); } }
Oracle数据库用EF操作的示例