如何在Entity Framework中正确映射Oracle Number(1,0)至Boolean类型
问题
在EF6数据库优先(DB-first)模式下,将Oracle的number(1)类型手动映射为C#的Boolean类型后,程序可正常编译运行,但在edmx设计器中始终报错:
Error 2019: Member Mapping specified is not valid. The type 'Edm.Boolean[Nullable=False,DefaultValue=]' [...] is not compatible with 'OracleEFProvider.number[Nullable=False,DefaultValue=,Precision=1,Scale=0]'
已知Oracle原生不支持Boolean类型,尝试过手动修改edmx或自定义app.config的edmMappings均无法消除该错误提示,想知道是否有新的解决方案能保留Boolean映射同时消除错误。
解决方案
方法1:使用Oracle官方ODP.NET驱动并配置全局类型映射
确保使用Oracle ODP.NET, Managed Driver(而非旧版非托管驱动),在app.config或web.config中添加全局类型映射规则,强制将number(1,0)映射为Edm.Boolean:
<configuration> <oracle.manageddataaccess.client> <version number="*"> <edmMappings> <edmMapping dataType="number"> <add name="bool" precision="1" scale="0" dbType="number(1,0)" /> </edmMapping> </edmMappings> </version> </oracle.manageddataaccess.client> </configuration>
添加后重新生成edmx模型,设计器的错误提示会自动消除,实体类型也会默认映射为Boolean。
方法2:手动修改edmx的XML源码
若不想修改配置文件,可直接编辑edmx的XML源码:
- 右键edmx文件 → 选择打开方式 → XML(文本)编辑器
- 在
<edmx:StorageModels>节点下,找到对应number(1,0)列的Property定义,将Type属性改为boolean,并删除Precision和Scale属性:<Property Name="IS_VALID" Type="boolean" Nullable="false" /> - 在
<edmx:ConceptualModels>节点下,确保对应实体属性的类型为Boolean:<Property Name="IsValid" Type="Boolean" Nullable="false" /> - 保存XML后重新打开设计器,错误提示会消失。注意:后续从数据库更新模型时,该修改会被覆盖,需重新调整。
方法3:切换到Code-First模式(长期方案)
若频繁遇到模型更新覆盖配置的问题,可考虑切换到Code-First模式:
- 通过
Reverse Engineer Code First工具从Oracle数据库生成实体类和DbContext - 在实体类中直接将对应字段标记为
bool类型,通过Fluent API配置映射:modelBuilder.Entity<YourEntity>() .Property(e => e.IsValid) .HasColumnType("NUMBER(1,0)");
这种方式完全绕过edmx设计器的类型校验问题,且配置不会被模型更新覆盖。
内容的提问来源于stack exchange,提问作者mba645
相关产品推荐
相关产品推荐

