從Code MSDN上下載下來的EFOracleProvider不支持Oracle9i.但是,目前我所使用的還是Oracle9i。為此,對EFOracleProvider修改了以下,以便使其支持Oracle9i.
下面說說具體修改地方.(紅色部分為添加或修改的代碼部分)
一,修改EFOracleProvider
1,修改EFOracleProviderManifest.cs類文件,
internal const string TokenOracle9i = "9i";//add by xray2005
internal const string TokenOracle10g = "10g";
internal const string TokenOracle11g = "11g";
以下兩個地方,不修改也是可以的.但考慮目前我主要是使用9i,所以也就修改成9i了.
private EFOracleVersion _version = EFOracleVersion.Oracle9i; //EFOracleVersion.Oracle11g;
private string _token = TokenOracle9i; //TokenOracle10g;
2,修改EFOracleVersion.cs類文件,如下代碼所示:
namespaceEFOracleProvider
{
using System;
///
///This enum describes the current storage version
///
internal enum EFOracleVersion
{
Oracle9i = 9, //add by xray2005
///
///Oracle10g
///
Oracle10g = 10,
///
///Oracle 11g
///
Oracle11g = 11,
// higher versions go here
}
///
///This class is a simple utility class that determines the version from the
///connection
///
internal static class EFOracleVersionUtils
{
///
///Get the version from the connection.
///
/// current connection
/// version for the current connection
internal static EFOracleVersion GetStorageVersion(EFOracleConnection connection)
{
string serverVersion = connection.ServerVersion;
if (serverVersion.StartsWith("9."))
{
return EFOracleVersion.Oracle9i;//add by xray2005
}
else if (serverVersion.StartsWith("10."))
{
return EFOracleVersion.Oracle10g;
}
else if (serverVersion.StartsWith("11."))
{
return EFOracleVersion.Oracle11g;
}
throw new ArgumentException("Could not determine storage version; " +
"a valid storage connection or a version hint is required.");
}
internal static string GetVersionHint(EFOracleVersion version)
{
switch (version)
{
case EFOracleVersion.Oracle9i:
return EFOracleProviderManifest.TokenOracle9i;//add by xray2005
case EFOracleVersion.Oracle10g:
return EFOracleProviderManifest.TokenOracle10g;
case EFOracleVersion.Oracle11g:
return EFOracleProviderManifest.TokenOracle11g;
default:
throw new ArgumentException("Could not determine storage version; " +
"a valid storage connection or a version hint is required.");
}
}
internal static EFOracleVersion GetStorageVersion(string versionHint)
{
if (!string.IsNullOrEmpty(versionHint))
{
switch (versionHint)
{
case EFOracleProviderManifest.TokenOracle9i:
return EFOracleVersion.Oracle9i;//add by xray2005
case EFOracleProviderManifest.TokenOracle10g:
return EFOracleVersion.Oracle10g;
case EFOracleProviderManifest.TokenOracle11g:
return EFOracleVersion.Oracle11g;
}
}
throw new ArgumentException("Could not determine storage version; " +
"a valid storage connection or a version hint is required.");
}
internal static bool IsVersionX(EFOracleVersion storageVersion)
{
return storageVersion == EFOracleVersion.Oracle9i || storageVersion == EFOracleVersion.Oracle10g ||
storageVersion == EFOracleVersion.Oracle11g;//add by xray2005
}
}
}
二,使用EFOracleProvider
修改完畢后,編譯一下.如果是自己下載的源代碼編譯的,那么編譯后的EFOracleProvider自動已經在GAC注冊了.如果是手動注冊EFOracleProvider到GAC,那么命令如下:
gacutil –I“EFOracleProvider.dll”
其中gacutil.exe位于:系統盤符號:\Program Files\Microsoft SDKs\Windows\v6.0A\bin下面。
接下來,我們需要做的就是,把這個EFOracleProvider添加到Machine.config中.
第一步,找到Machine.config文件.該文件的位置在:
系統盤符號:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG下面.
第二步,用打開Machine.config文件,在DbProviderFactories配置節點,增加EFOracleProvider的配置,如下所示:
description=".Net Framework Data Provider for Odbc"
type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
description=".Net Framework Data Provider for OleDb"
type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
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" />
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" />
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" />
name="EF Oracle Data Provider" invariant="EFOracleProvider"
description="EF Provider for Oracle"
type="EFOracleProvider.EFOracleProviderFactory,EFOracleProvider,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
第三步,保存即可.
接下來,簡單的介紹一下,如何使用這個EFOralceProvider.
第1步:在命令行窗口,將目錄定位到提示符, 系統盤符:\WINDOWS\Microsoft.NET\Framework\v3.5.如下所示(是我電腦上的目錄):
第2步,輸入相應的生成參數.如下圖所示:
將“data source=test;user id=xray;password= 123”成你自己的對應的參數即可.
確定之后,就可以看到生成的結果了,同時會有寫信息出來,如下示:
至此,EdmGen就為我們生成需要的文件.生成的文件如下所示:
lTestEFModel.csdl
lTestEFModel.msl
lTestEFModel.ssdl
lTestEFModel.ObjectLayer.cs
lTestEFModel.Views.cs
然后,通過EdmGen2工具, 使用剛剛生成的TestEFModel .csdl, TestEFModel .msl, TestEFModel .ssdl三個文件來生成一個模型.
命令如下:
Edmgen2.exe /toedmx TestEFModel.csdl TestEFModel.msl TestEFModel.ssdl
確定之后,該工具就會為我們生成一個TestEFModel.edmx文件了.
然后,把這個文件加入到我們的項目中,同時修改項目的App.Config文件連接字符串,如下所示:
connectionString="provider=EFOracleProvider;
metadata=res://*/TestEFModel.csdl|res://*/TestEFModel.ssdl|res://*/TestEFModel.msl;
Provider Connection String='data source=test;user id=xray;password=1111'"
providerName="System.Data.EntityClient" />
最后保存.
至此,修改EFOracleProvider并使用,介紹完畢。
最后提供幾個連接,以方便大家學習研究: