首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

Entity Framework 中級學習(五):讓 EF 支援 Oracle 9i

     編輯:關於ASP.NET

官方 EFOracleProvider 僅支援 Oracle 10g/11g,但生產環境仍在使用 Oracle 9i。本文記錄修改 Provider 原始碼以相容 9i 的關鍵步驟(紅色標註為新增/修改處)。

一、修改 EFOracleProviderManifest.cs

internal const string TokenOracle9i = "9i"; // add by xray2005
internal const string TokenOracle10g = "10g";
internal const string TokenOracle11g = "11g";

private EFOracleVersion _version = EFOracleVersion.Oracle9i; // 原為 Oracle11g
private string _token = TokenOracle9i; // 原為 TokenOracle10g

二、修改 EFOracleVersion.cs

namespace EFOracleProvider {
  internal enum EFOracleVersion {
    Oracle9i = 9, // add by xray2005
    Oracle10g = 10,
    Oracle11g = 11
  }

  internal static class EFOracleVersionUtils {
    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...");
    }

    internal static string GetVersionHint(EFOracleVersion version) {
      switch (version) {
        case EFOracleVersion.Oracle9i: return EFOracleProviderManifest.TokenOracle9i; // add
        case EFOracleVersion.Oracle10g: return EFOracleProviderManifest.TokenOracle10g;
        case EFOracleVersion.Oracle11g: return EFOracleProviderManifest.TokenOracle11g;
        default: throw new ArgumentException("...");
      }
    }

    internal static EFOracleVersion GetStorageVersion(string versionHint) {
      if (!string.IsNullOrEmpty(versionHint)) {
        switch (versionHint) {
          case EFOracleProviderManifest.TokenOracle9i: return EFOracleVersion.Oracle9i; // add
          case EFOracleProviderManifest.TokenOracle10g: return EFOracleVersion.Oracle10g;
          case EFOracleProviderManifest.TokenOracle11g: return EFOracleVersion.Oracle11g;
        }
      }
      throw new ArgumentException("...");
    }

    internal static bool IsVersionX(EFOracleVersion storageVersion) {
      return storageVersion == EFOracleVersion.Oracle9i
          || storageVersion == EFOracleVersion.Oracle10g
          || storageVersion == EFOracleVersion.Oracle11g; // add
    }
  }
}

修改完成後重新編譯 Provider,即可在連接字串指定 VersionHint=9i 或自動偵測 9i 環境下正常運作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved