`

Entity Framework 学习中级篇—使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

http://www.cnblogs.com/xray2005/archive/2009/06/05/1496740.html

分享到:
评论

相关推荐

    .NET EntityFramework框架学习教程

    3. 使EF支持Oracle9i:展示了如何配置和使用EF与非SQL Server的数据库系统,如Oracle,扩展了EF的适用范围。 高级篇进一步讨论了提升EF代码质量和性能的策略: 1. 改善EF代码的方法:可能包括使用Code First开发、...

    详细的Entity Framework介绍PDF格式

    中级篇深入探讨了EF的一些高级主题,包括支持复杂类型的实现、存储过程的使用、以及如何让Entity Framework支持Oracle9i等不同的数据库系统。存储过程的使用涉及如何将EF映射到数据库中的存储过程,以及如何通过EF...

    Entity_Framework_ѧϰ.doc

    中级篇的第五部分介绍了如何使EF支持Oracle9i,展示了EF的跨数据库平台能力。 高级篇主要关注优化和改善EF代码的方法,包括代码重构和性能提升技巧,这对于大型项目和高性能应用至关重要。 最后的结束语可能对学习...

    Entity Framework学习

    #### 十一、使 EF 支持 Oracle9i - **介绍**: 解释如何配置和使用 EF 以支持 Oracle 数据库。 - **配置**: 包括 Oracle 数据库连接字符串设置、数据提供程序选择等。 #### 十二、改善 EF 代码的方法 - **上篇**: ...

Global site tag (gtag.js) - Google Analytics