EntityFramework,配合Oracle.ManagedDataAccess配置Oracle數據庫鏈接

1.環境:html

windows10,vs2017,oracle 11g(32 bit),PLSQL Developer 13 (32 bit)。sql

2.準備工具:數據庫

下載oracle 11g,地址:https://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098987.htmlwindows

下載ODAC for Visual Studio 2017,地址:https://www.oracle.com/technetwork/topics/dotnet/downloads/odacmsidownloadvs2017-3806459.htmloracle

下載PLSQL Developer 13(32 bit) ,地址:https://www.allroundautomations.com/bodyplsqldevreg.htmlapp

3.安裝:框架

先oracle 11g安裝;tcp

而後安裝PLSQL Developer 13(32 bit) ;ide

最後安裝ODAC for Visual Studio 2017;工具

4.配置

  • 安裝完ODAC for Visual Studio 2017後VS擴展內有多兩個DLL,直接在項目中引用

  • 在映射文件中將數據映射字段,及表名所有改爲大寫。

5.配置config文件

加入以下節點,注意版本號

 

<oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="xxxx" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxxx))) " />
      </dataSources>
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1" />
          <add name="byte" precision="2" />
          <add name="int16" precision="5" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="xxxx" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=xxxx;Password=xxxx;Data Source=xxxx" />
  </connectionStrings>

注意這邊的Data Source與xml中節點的名稱同樣<dataSource /> ,這裏的<edmMappings>還能夠增長int32,及int64。

若出現鏈接錯誤,能夠在connectionString中加入Persist Security Info=True;

<entityFramework>
    <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />-->
    <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>
<system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
<configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>

來個完整點的,可是這個沒有數據鏈接節點

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <entityFramework>
    <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>
View Code

6.代碼修改

在DbContext中OnModelCreating方法內增長一句

modelBuilder.HasDefaultSchema("xxxx");這裏的xxxx是指用戶名,我用的是SYSTEM。

 

 

配置完後能夠使用EF的代碼遷移進行建表。

7.踩坑指南:

  • oracle數據庫32位的,那麼PLSQL 也要32位的。
  • nuget上的Oracle.ManagedDataAccess及Oracle.ManagedDataAccess.EntityFramework我試了,不過我這邊不能用,不知道其餘人如何。
  • string類型的模型字段值,最好給個長度。否則在取值時會出現錯誤。
  • 數據庫表名及屬性長度30位
  • 使用ABP框架請在模塊配置文件中配置(該配置很重要
  1. Database.SetInitializer(new CreateDatabaseIfNotExists<ServerOracleDbContext>());
  2. Configuration.UnitOfWork.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
相關文章
相關標籤/搜索