使用ef6創(chuàng)建oracle數(shù)據(jù)庫的實(shí)體模型遇到的問題及解決方案
解決方案中的數(shù)據(jù)層項(xiàng)目最初使用的是oracle 11g + ef5 創(chuàng)建的實(shí)體模型,在分頁時(shí)遇到了skip參數(shù)為0報(bào)錯(cuò)的問題,沒有找到相關(guān)資料。
于是決定升級到ef6,在oracle官網(wǎng)中得知,Oracle Data Provider for .NET in ODAC 12c Release 3 開始支持ef6(https://docs.oracle.com/cd/E56485_01/win.121/e55744/release_changes.htm#CIHGIAEG)
安裝步驟:
1.安裝odac,下載地址http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html
2.數(shù)據(jù)層項(xiàng)目的.net版本改成4.5以上,使用nuget安裝 EntityFramework 6 +Oracle.ManagedDataAccess +Oracle.ManagedDataAccess.EntityFramework,都安裝最新穩(wěn)定版。
安裝后app.config和web.config都會被加入如下配置項(xiàng)
<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)上找的資料里的配置項(xiàng)放在里面了,但是版本號不一致,程序啟動不了,一直沒注意到版本號,
找了好一會才發(fā)現(xiàn)是這兩個(gè)地方。
3.然后就可以添加實(shí)體模型了。此時(shí)如果vs中顯示找不到與ef6 兼容的實(shí)體框架提供程序,需要將配置文件中的ef節(jié)的 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />刪掉或者注釋掉,保存后再重新嘗試添加實(shí)體模型。
添加實(shí)體模型時(shí)需要先不選擇數(shù)據(jù)庫里的表,即生成空模型,然后打開edmx文件,在模型瀏覽器中選中實(shí)體模型,在屬性中把DDL生成模板改成SSDLToOracle.tt (VS),數(shù)據(jù)庫生成工作流改成Generate Oracle Via T4 (TPT).xaml (VS)。
這么做的原因是如果DDL生成模板使用默認(rèn)項(xiàng)SSDLToOracle.tt ,oracle中的number(1,0)和number(2,0)類型的字段生成的實(shí)體屬性的類型會是int16,然后運(yùn)行的時(shí)候報(bào)映射不匹配的錯(cuò)誤(錯(cuò)誤代碼2019)。
報(bào)錯(cuò)原因是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,這個(gè)對應(yīng)關(guān)系與新映射是一致的。
附上ef5的映射
| Oracle Type | Default EDM Type | Custom EDM Type |
|---|---|---|
Number(1,0) |
Int16 |
bool |
Number(2,0) to Number(3,0) |
Int16 |
byte |
Number(4,0) |
Int16 |
Int16 |
Number(5,0) |
Int16 |
Int32 |
Number(6,0) to Number(9,0) |
Int32 |
Int32 |
Number(10,0) |
Int32 |
Int64 |
Number(11,0) to Number(18,0) |
Int64 |
Int64 |
Number(19,0) |
Int64 |
Decimal |
總結(jié)
以上所述是小編給大家介紹的使用ef6創(chuàng)建oracle數(shù)據(jù)庫的實(shí)體模型遇到的問題及解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
使用JavaScriptCore實(shí)現(xiàn)OC和JS交互詳解
JavaScriptCore是webkit的一個(gè)重要組成部分,主要是對JS進(jìn)行解析和提供執(zhí)行環(huán)境。下面這篇文章主要給大家介紹了使用JavaScriptCore實(shí)現(xiàn)OC和JS交互的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2017-03-03
JavaScript實(shí)現(xiàn)頁面跳轉(zhuǎn)的八種方式
這篇文章介紹了JavaScript實(shí)現(xiàn)頁面跳轉(zhuǎn)的八種方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
JavaScript中Object.values()的用法舉例
這篇文章主要給大家介紹了關(guān)于JavaScript中Object.values()的用法舉例,Object.values()是JavaScript中一個(gè)內(nèi)置的靜態(tài)函數(shù),用于返回一個(gè)對象中所有屬性值的數(shù)組,需要的朋友可以參考下2023-09-09
javascript權(quán)威指南 學(xué)習(xí)筆記之變量作用域分享
最近一直在看《javascript權(quán)威指南 第五版》,變量作用域這一章,看得真的有點(diǎn)累。不過,收獲還是多多。2011-09-09
JS+flash實(shí)現(xiàn)chrome和ie瀏覽器下同時(shí)可以復(fù)制粘貼
chrome和ie同時(shí)可以復(fù)制粘貼,想必大家一直思索的問題在本文將有一個(gè)不錯(cuò)的實(shí)現(xiàn),下面為大家介紹下JS+flash是如何實(shí)現(xiàn)的,感興趣的朋友可以參考下2013-09-09
有關(guān)suggest快速刪除后仍然出現(xiàn)下拉列表的bug問題
寫suggest的時(shí)候,有時(shí)我們快速刪除輸入框的文字后,但是suggest下拉列表還有出現(xiàn),導(dǎo)致的原因是因?yàn)閍jax異步請求造成的,下面通過本文給大家分享下解決方法,感興趣的朋友一起看看2016-12-12

