VS2017通过“从数据库更新模型”添加Oracle表时遇“mapping fragments”错误
解决EDMX更新时的"mapping fragments"错误
针对你在VS2017中更新EDMX模型时遇到的这个问题,我之前处理过类似的场景,大概率是EF的模型映射和数据库结构的匹配出了点小问题,给你几个可行的排查和解决步骤:
1. 确认新表的主键定义是否准确
你提到把关联REQUESTS.REQUEST_ID的列设为主键,这里要仔细核对:
- 确保
ATTACHMENTS_UNSUBMITTED表的主键确实是REQUEST_ID(如果是复合主键,要保证所有主键列都在数据库中有明确的主键约束) - 数据库中该主键约束是独立存在的,而非仅依赖外键关联
可以用这条SQL再次验证约束情况:
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, COLUMN_NAME FROM USER_CONSTRAINTS JOIN USER_CONS_COLUMNS ON USER_CONSTRAINTS.CONSTRAINT_NAME = USER_CONS_COLUMNS.CONSTRAINT_NAME WHERE USER_CONSTRAINTS.TABLE_NAME = 'ATTACHMENTS_UNSUBMITTED';
要能看到明确标记为PRIMARY KEY的约束,且对应的列是REQUEST_ID。
2. 清理EDMX的缓存文件
有时候VS的EDMX会缓存旧的模型结构,导致更新时出现冲突:
- 先关闭VS2017,找到项目中EDMX文件对应的
.edmx.diagram和.edmx.sqlce(如果存在的话),先备份再删除 - 重新打开VS,右键EDMX选择「从数据库更新模型」,只勾选
ATTACHMENTS_UNSUBMITTED表重试
3. 手动修复EDMX的XML映射
如果自动更新还是报错,可以手动编辑EDMX的XML内容来修正映射:
- 右键EDMX文件,选择「打开方式」→「XML编辑器」
- 找到
<edmx:StorageModels>部分,确认ATTACHMENTS_UNSUBMITTED的实体定义包含正确的主键配置:<EntityType Name="ATTACHMENTS_UNSUBMITTED"> <Key> <PropertyRef Name="REQUEST_ID" /> </Key> <Property Name="REQUEST_ID" Type="int" Nullable="false" /> <!-- 其他列的定义 --> </EntityType> - 再找到
<edmx:ConceptualModels>部分,确保概念模型里的实体与存储模型主键一致,外键关联也正确:<Association Name="FK_REQ_ID"> <End Role="REQUESTS" Type="YourModelNamespace.REQUESTS" Multiplicity="1" /> <End Role="ATTACHMENTS_UNSUBMITTED" Type="YourModelNamespace.ATTACHMENTS_UNSUBMITTED" Multiplicity="0..1" /> <ReferentialConstraint> <Principal Role="REQUESTS"> <PropertyRef Name="REQUEST_ID" /> </Principal> <Dependent Role="ATTACHMENTS_UNSUBMITTED"> <PropertyRef Name="REQUEST_ID" /> </Dependent> </ReferentialConstraint> </Association> - 保存XML后,重新生成项目,再验证模型是否正常。
4. 检查EF版本与Oracle驱动的兼容性
VS2017常用的EF版本(多为EF6)和Oracle数据访问驱动(比如ODP.NET)之间可能存在兼容性问题:
- 确认你的Oracle驱动是最新的稳定版本(比如ODP.NET Managed Driver)
- 检查项目中EF的版本是否与驱动兼容,可尝试将EF更新到6.4.4这类稳定版本
补充说明:"mapping fragments"错误通常是因为EF无法将数据库表结构正确映射到概念模型,常见于主键缺失、外键关联不明确、模型缓存冲突这几种情况,按上面的步骤逐一排查基本能解决问题。
内容的提问来源于stack exchange,提问作者user2505177
相关产品推荐
相关产品推荐

