You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle EF6中NUMBER(2,0)映射Int16报Error2019的解决求助

问题

我正在开发基于.NET Framework 4.8的项目,使用Oracle 19c数据库,搭配最新版Oracle.ManagedDataAccess(23.6.1)、Oracle.ManagedDataAccess.EntityFramework(23.4.0)及Entity Framework(6.5.1)包。EDMX模型中,ACADEMIC_ADVISING表的SECTION_NO列在Oracle中定义为NUMBER(2,0)。

默认该列被映射为byte类型,我修改App.config将其映射为Int16,配置如下:

<oracle.manageddataaccess.client>
  <version number="*">
    <edmMappings>
      <edmNumberMapping>
        <add NETType="int16" MinPrecision="2" MaxPrecision="2" DBType="Number" />
      </edmNumberMapping>
    </edmMappings>
  </version>
</oracle.manageddataaccess.client>

重新生成EDMX模型后,SECTION_NO已按预期映射为Int16,但每次打开Visual Studio或重建项目时,都会出现错误:

Error 2019: Member Mapping specified is not valid. The type 'Edm.Int16[Nullable=True,DefaultValue=]' of member 'SECTION_NO' in type 'Model.ACADEMIC_ADVISING' is not compatible with 'OracleEFProvider.number[Nullable=True,DefaultValue=,Precision=2,Scale=0]' of member 'SECTION_NO' in type 'Model.Store.ACADEMIC_ADVISING'.

我已尝试以下操作:

  • 验证数据库列定义:COLUMN_NAME为SECTION_NO,DATA_TYPE为NUMBER,DATA_PRECISION=2,DATA_SCALE=0;
  • 按上述配置修改App.config添加明确的edmNumberMapping;
  • 重建EDMX文件并确认SECTION_NO属性映射为Int16。

尽管如此,关闭并重新打开Visual Studio后错误仍会出现,仅重建项目后错误暂时消失。如何永久解决该问题,让Oracle Managed Data Access与Entity Framework持续识别NUMBER(2,0)与Int16的映射?是否需要额外配置Oracle EF或Visual Studio?

解决方案

1. 优化EDM映射配置

当前的映射规则未限定Scale范围,可能导致EF设计器识别冲突。修改App.config中的映射,添加Scale的精确匹配:

<oracle.manageddataaccess.client>
  <version number="*">
    <edmMappings>
      <edmNumberMapping>
        <add NETType="int16" MinPrecision="2" MaxPrecision="2" MinScale="0" MaxScale="0" DBType="Number" />
      </edmNumberMapping>
    </edmMappings>
  </version>
</oracle.manageddataaccess.client>

这样配置仅针对NUMBER(2,0)的列映射为Int16,避免与其他Scale的Number列混淆。

2. 手动修正EDMX文件的映射定义

EDMX设计器可能未正确读取全局配置,需直接编辑EDMX的XML内容:

  • 右键EDMX文件,选择「打开方式」→「XML(文本)编辑器」;
  • 在<edmx:StorageModels>节点下,找到SECTION_NO列的定义,确认其Type="number"、Precision="2"、Scale="0";
  • 在<edmx:ConceptualModels>节点下,对应SECTION_NO属性需设置Type="Int16";
  • 在<edmx:Mappings>节点中,确保概念模型的Int16类型与存储模型的number(2,0)正确关联,无类型不匹配的条目;
  • 保存文件后重新生成项目。

3. 清除Visual Studio缓存

旧缓存可能导致映射规则残留:

  • 关闭Visual Studio;
  • 删除项目目录下的.vs隐藏文件夹;
  • 删除bin和obj文件夹;
  • 重新打开项目并执行生成操作。

4. 统一Oracle组件版本

当前Oracle.ManagedDataAccess(23.6.1)与Oracle.ManagedDataAccess.EntityFramework(23.4.0)版本不匹配,可能引发兼容性问题:

  • 将两个组件升级至同一大版本(如均为23.6.1,需确认存在对应版本的EF包);
  • 若最新版本存在问题,可降级至稳定匹配版本(如23.3.0),确保组件版本协同工作。

5. 迁移至代码优先模式(可选)

若EDMX设计器的问题无法彻底解决,可切换到EF6的代码优先模式,完全手动控制类型映射:
定义实体类:

public class ACADEMIC_ADVISING
{
    // 其他属性省略
    public short SECTION_NO { get; set; }
}

在DbContext中配置映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ACADEMIC_ADVISING>()
        .Property(t => t.SECTION_NO)
        .HasColumnType("NUMBER")
        .HasPrecision(2, 0);
}

这种方式绕过EDMX设计器的自动映射逻辑,类型映射更稳定可控。

内容的提问来源于stack exchange,提问作者AZ01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:30:03