手续同遇到的问题——使用ef6创办oracle数据库的实体模型

化解方案中之数据层项目前期使用的凡oracle 11g + ef5
创建的实体模型,在分页时撞了skip参数为0报错的问题,没有找到相关资料。

于是决定升级到ef6,在oracle官网中查获,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.数据层项目之.net版本更改化4.5以上,使用nuget安装 EntityFramework
6 +Oracle.ManagedDataAccess
+Oracle.ManagedDataAccess.EntityFramework,都装时稳定版。

安装后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安装后自动生成的貌似没有问题,我以安前将网上寻找的素材里的部署起在其中了,但是版本号不一样,程序启动不了,一直尚未放在心上到本号,

搜索了好同一会晤才发觉是马上半独地方。

3.然继虽足以添加实体模型了。此时如vs中显搜不交同ef6
兼容的实体框架提供程序
,需要用配备文件中之ef节的 <provider
invariantName=”System.Data.SqlClient”
type=”System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer”
/>删掉或者注释掉,保存后再也又尝试添加实体模型。

加上实体模型时得事先不拣数据库里的表,即生成空模型,然后打开edmx文件,在范浏览器被当选实体模型,在性质被管DDL生成模板改化SSDLToOracle.tt
(VS),数据库生成工作流改成为Generate Oracle Via T4
(TPT).xaml
(VS)。

如此这般做的房地产项目来头是要是DDL生成模板下默认项SSDLToOracle.tt
oracle中之number(1,0)和number(2,0)类型的字段生成的实业性之类型会是int16,然后运行的时报映射不匹配的荒谬(错误代码2019)。

报错原因是oracle从ODP.NET
12.1.0.2初步也ef6运用新的默认类型映射,官网证实https://docs.oracle.com/cd/E56485\_01/win.121/e55744/entityDataTypeMapping.htm\#ODPNT8303,其中的 New
Default Mappings 段。

SSDLToOracle.tt模板生成的性之型是number(1,0)对应boolean,number(2,0)对应byte,这个相应关系及新映射是相同的。

附上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

相关文章