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

