溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用ef6創(chuàng)建oracle數(shù)據(jù)庫

發(fā)布時間:2021-07-12 10:21:57 來源:億速云 閱讀:103 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)如何使用ef6創(chuàng)建oracle數(shù)據(jù)庫的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

解決方案中的數(shù)據(jù)層項目最初使用的是oracle 11g + ef5 創(chuàng)建的實體模型,在分頁時遇到了skip參數(shù)為0報錯的問題,沒有找到相關(guān)資料。

于是決定升級到ef6,在oracle官網(wǎng)中得知,Oracle Data Provider for .NET in ODAC 12c Release 3 開始支持ef6

安裝步驟:

1.安裝odac,下載地址http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

2.數(shù)據(jù)層項目的.net版本改成4.5以上,使用nuget安裝 EntityFramework 6 +Oracle.ManagedDataAccess +Oracle.ManagedDataAccess.EntityFramework,都安裝最新穩(wěn)定版。

安裝后app.config和web.config都會被加入如下配置項

<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>
 <entityFramework>
 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
  <parameter value="mssqllocaldb" />
  </parameters>
 </defaultConnectionFactory>
 <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>
 <runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
  <publisherPolicy apply="no" />
  <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
  </dependentAssembly>
 </assemblyBinding>
 </runtime>
 <oracle.manageddataaccess.client>
 <version number="*">
  <dataSources>
  <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
  </dataSources>
 </version>
 </oracle.manageddataaccess.client>

注意 entityFramework和 system.data中的版本號,nuget安裝后自動生成的一般沒問題,我在安裝之前把網(wǎng)上找的資料里的配置項放在里面了,但是版本號不一致,程序啟動不了,一直沒注意到版本號,

找了好一會才發(fā)現(xiàn)是這兩個地方。

3.然后就可以添加實體模型了。此時如果vs中顯示找不到與ef6 兼容的實體框架提供程序,需要將配置文件中的ef節(jié)的 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />刪掉或者注釋掉,保存后再重新嘗試添加實體模型。

添加實體模型時需要先不選擇數(shù)據(jù)庫里的表,即生成空模型,然后打開edmx文件,在模型瀏覽器中選中實體模型,在屬性中把DDL生成模板改成SSDLToOracle.tt (VS),數(shù)據(jù)庫生成工作流改成Generate Oracle Via T4 (TPT).xaml (VS)。

這么做的原因是如果DDL生成模板使用默認(rèn)項SSDLToOracle.tt ,oracle中的number(1,0)和number(2,0)類型的字段生成的實體屬性的類型會是int16,然后運行的時候報映射不匹配的錯誤(錯誤代碼2019)。

報錯原因是oracle從ODP.NET 12.1.0.2開始為ef6采用新的默認(rèn)類型映射,官網(wǎng)說明https://docs.oracle.com/cd/E56485_01/win.121/e55744/entityDataTypeMapping.htm#ODPNT8303,其中的 New Default Mappings 段。

SSDLToOracle.tt模板生成的屬性的類型是number(1,0)對應(yīng)boolean,number(2,0)對應(yīng)byte,這個對應(yīng)關(guān)系與新映射是一致的。

附上ef5的映射

Oracle TypeDefault EDM TypeCustom EDM Type
Number(1,0)Int16bool
Number(2,0) to Number(3,0)Int16byte
Number(4,0)Int16Int16
Number(5,0)Int16Int32
Number(6,0) to Number(9,0)Int32Int32
Number(10,0)Int32Int64
Number(11,0) to Number(18,0)Int64Int64
Number(19,0)Int64Decimal

感謝各位的閱讀!關(guān)于“如何使用ef6創(chuàng)建oracle數(shù)據(jù)庫”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI