如何在.Net Core Entity Framework EDMX中为受影响实体添加Oracle Flashback列
.NET Core EF EDMX添加Oracle Flashback审计列方案
由于Oracle Flashback相关的审计字段属于表伪列,默认不会被EF的EDMX刷新逻辑识别,需按以下步骤手动添加:
操作步骤
- 打开项目中的
.edmx文件,在模型浏览器中定位到需要对接Flashback功能的目标实体 - 右键目标实体,依次选择「添加」→「标量属性」,按实际需求添加需要用到的Flashback字段,字段名需和Oracle官方伪列名完全一致,常用字段及对应C#类型如下:
ORA_ROWSCN:对应long?VERSIONS_STARTTIME:对应DateTime?VERSIONS_ENDTIME:对应DateTime?VERSIONS_OPERATION:对应string(存储I/U/D标识增删改操作)VERSIONS_XID:对应string(存储事务ID)
- 选中每个刚添加的Flashback属性,打开属性面板,将
StoredGeneratedPattern字段设置为Computed,避免EF在增改操作时向这些列写入值触发数据库报错 - 右键
.edmx文件,选择「打开方式」→「XML(文本)编辑器」,找到目标实体对应的<MappingFragment>节点,为每个新增的Flashback属性添加列映射,示例配置如下:
<MappingFragment StoreEntitySet="你的表名"> <!-- 原有其他字段映射 --> <ScalarProperty Name="VERSIONS_STARTTIME" ColumnName="VERSIONS_STARTTIME" /> <ScalarProperty Name="VERSIONS_OPERATION" ColumnName="VERSIONS_OPERATION" /> <ScalarProperty Name="ORA_ROWSCN" ColumnName="ORA_ROWSCN" /> </MappingFragment>
- 保存EDMX文件并重新生成实体类,Flashback相关属性就会同步到实体中。
功能验证
你可以直接通过EF的原生查询接口调用Flashback语法获取审计数据,示例代码如下:
// 查询最近7天指定数据的变更记录 var changeLogs = dbContext.你的实体集 .FromSql($"SELECT * FROM 你的表名 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '7' DAY AND SYSTIMESTAMP WHERE 主键字段 = {目标Id}") .ToList();
查询返回的实体对象会自动填充对应的Flashback属性值。
注意事项
- 后续从数据库刷新EDMX模型时,手动添加的Flashback属性不会被覆盖,无需重复配置
- 所有Flashback属性必须设置为可空,常规增删改操作不会返回这些字段的值,非空约束会触发EF运行时校验错误
内容的提问来源于stack exchange,提问作者C. Allen
相关产品推荐
相关产品推荐

