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.html

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.app

3. Open elevated Visual Studio instance. Build the sample project.編輯器

4. Open elevated command prompt and open machine.config using notepad:ide

notepad %WINDIR%\Microsoft.NET\Framework\v2.0.50727\config\machine.config工具

5. Find <DbProviderFactories> section and add EFOracleProvider entry:post

<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 applicationui

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); } }