EF6 Database First针对Oracle部分表未生成C#类问题求助
我之前维护旧项目时碰到过一模一样的情况——用VS2013+EF6.1.3对接Oracle12c,部分表死活只出现在*Storage Model(SSDL)*里,*Conceptual Model(CSDL)*完全没生成,导致没法生成对应的C#实体类。结合当时的排查经验,给你几个靠谱的解决方向:
检查表名与Oracle保留字冲突:Oracle的表名如果是
USER、DATE这类保留字,或者用双引号定义了小写/特殊字符表名,EF在生成Conceptual Model时会直接跳过。你可以先查一下这些异常表的名称,如果是保留字,要么给表重命名(业务允许的话),要么在EDMX的Storage Model里手动修改表名的映射规则,再重新触发Conceptual Model生成。升级Oracle ODAC驱动版本:VS2013默认的Oracle驱动可能和EF6.1.3不兼容——EF6需要ODAC 12c Release 4及以上版本的支持。你可以检查当前安装的Oracle Developer Tools for VS版本,如果低于这个版本,赶紧升级到兼容版,然后重新连接数据库生成EDMX,大概率能解决问题。
手动补全Conceptual Model与映射:如果自动生成实在不行,就手动来补:
- 右键EDMX文件,选择
打开方式 -> XML编辑器,打开原始XML结构 - 在
<edmx:ConceptualModels>节点下,参照其他正常表的CSDL结构,手动编写对应表的实体定义(注意字段类型要和Storage Model对应) - 接着在
<edmx:Mappings>节点下,添加该表从SSDL到CSDL的映射关系 - 保存后右键EDMX,选择
生成数据库上下文和实体类,就能得到对应的C#类了
- 右键EDMX文件,选择
排查表权限与特殊数据类型:确保连接数据库的账号拥有这些表的
SELECT权限,同时检查表中有没有EF不支持的Oracle特殊类型——比如RAW、LONG RAW或者自定义复杂类型。如果有这类字段,要么在生成EDMX时排除它们,要么把字段类型转换成EF兼容的(比如用VARCHAR2替代RAW)。清理缓存重新生成EDMX:有时候EDMX文件会缓存旧的错误配置,你可以先删除现有EDMX,然后重新走Database First流程,生成时务必勾选那些有问题的表,同时留意生成向导里的自定义选项,确保没有误排除这些表。
内容的提问来源于stack exchange,提问作者Bill at Work

