使用Oracle托管驱动程序将NUMBER(10)映射为long的实体框架不起作用

时间:2016-05-09 14:25:17

标签: c# .net oracle entity-framework

我有一个现有的Oracle 11g数据库。

我创建了一个新的解决方案和一个新项目(.net 4.5),我添加了以下NuGet包:

  • package id =“EntityFramework”version =“6.1.3”
  • package id =“Oracle.ManagedDataAccess”version =“12.1.24160419”
  • package id =“Oracle.ManagedDataAccess.EntityFramework”version =“12.1.2400”

我的web.config指定了edmMappings的一个部分。

<oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
      </dataSources>

      <edmMappings>
        <edmMapping dataType="number">
          <add name="int64" precision="10" />
        </edmMapping>
      </edmMappings>
    </version>
</oracle.manageddataaccess.client>

然后,我使用数据库的EF Designer(模型优先)添加一个新的ADO.NET实体数据模型。

我有一个表PROCESS,其中LINK_ID列在Oracle中定义为NUMBER(10)。

生成的.edmx文件和entites(通过tt文件生成)使用普通的int(Int32)而不是我的映射中指定的long(Int64)。

我希望生成的模型使用long。

我可以手动更改此设置,但是在运行时我收到以下错误:

  

指定的架构无效。错误:\ r \ nTestMappings2.msl(18,12):   错误2019:指定的成员映射无效。类型   成员'LINK_ID'的'Edm.Int64 [Nullable = True,DefaultValue =]'   'Model.PROCESS'与。不兼容   'OracleEFProvider.number [可空=真,默认值=,精密= 10,标度= 0]'   在'Model.Store.PROCESS'类型中的成员'LINK_ID'。

如何让生成的模型使用正确的类型?为什么更改类型会给我一个运行时映射错误?

1 个答案:

答案 0 :(得分:3)

docs.oracle.com开始,edmMappings语法已更改为指定最小和最大精度,而不是指定截止点。

<add NETType="int64" MinPrecision="10" MaxPrecision="19" DBType="Number" />

旧的语法是:

<add name="int32" precision="9" />
<add name="int64" precision="18" />