• Entity Framework 学习中级篇5—使EF支持Oracle9i(转)


    从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类文件,如下代码所示:

    namespace EFOracleProvider

    {

        using System;

        /// <summary>

        /// This enum describes the current storage version

        /// </summary>

        internal enum EFOracleVersion

        {

             Oracle9i = 9, //add by xray2005

            /// <summary>

            /// Oracle10g

            /// </summary>

            Oracle10g = 10,

     

            /// <summary>

            /// Oracle 11g

            /// </summary>

            Oracle11g = 11,

            // higher versions go here

        }

        /// <summary>

        /// This class is a simple utility class that determines the version from the

        /// connection

        /// </summary>

        internal static class EFOracleVersionUtils

        {

            /// <summary>

            /// Get the version from the connection.

            /// </summary>

            /// <param name="connection">current connection</param>

            /// <returns>version for the current connection</returns>

            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的配置,如下所示:

    <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="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" />

         <add 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" />

    </DbProviderFactories>

    第三步,保存即可.

     

    接下来,简单的介绍一下,如何使用这个EFOralceProvider.

    第1步:在命令行窗口,将目录定位到提示符, 系统盘符:\WINDOWS\Microsoft.NET\Framework\v3.5.如下所示(是我电脑上的目录):

    第2步,输入相应的生成参数.如下图所示:

    “data source=test;user id=xray;password= 123”成你自己的对应的参数即可.

    确定之后,就可以看到生成的结果了,同时会有写信息出来,如下示:

     

    至此,EdmGen就为我们生成需要的文件.生成的文件如下所示:

    l           TestEFModel.csdl

    l           TestEFModel.msl

    l           TestEFModel.ssdl

    l           TestEFModel.ObjectLayer.cs

    l           TestEFModel.Views.cs

    然后,通过EdmGen2工具, 使用刚刚生成的TestEFModel .csdl, TestEFModel .msl, TestEFModel .ssdl三个文件来生成一个模型.

    命令如下:

    Edmgen2.exe /toedmx TestEFModel.csdl TestEFModel.msl TestEFModel.ssdl

    确定之后,该工具就会为我们生成一个TestEFModel.edmx文件了.

    然后,把这个文件加入到我们的项目中,同时修改项目的App.Config文件连接字符串,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <connectionStrings>
        <add name="NorthwindEFModelContext" 
             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" />
     </connectionStrings>
    </configuration>

    最后保存.

    至此,修改EFOracleProvider并使用,介绍完毕。

    最后提供几个连接,以方便大家学习研究:

    l           Code.MSDN上的EFOracleProvider

    l           经过我修改后,支持Oracle9i的EFOracleProvider.dll

    l           EdmGen2.exe 

     
  • 相关阅读:
    Thinkphp5.0实战开发一------命名空间详解
    软件测试技术实验二
    软件测试技术作业3---PrintPrimes()
    软件测试技术实验一
    Github使用教程(二)------ Github客户端使用方法
    Github使用教程(一)------ 初识Github
    软件测试技术作业2
    软件测试作业1 — 令我印象最深的BUG
    Github网站加载不完全,响应超时,如何解决
    利用puppeteer实现PDF文件导出
  • 原文地址:https://www.cnblogs.com/quietwalk/p/2096364.html
Copyright © 2020-2023  润新知