ef-core-2.1 - 审计从多个表到单个 EF 审计表的日志记录时出现无效的强制转换异常
问题描述
我的应用程序使用Audit.NET
withAudit.EntityFramework
来审计日志数据更改。为了便于创建审计日志/数据更改可视化,我决定将几个表的更改记录到一个表中。长话短说:我为我的项目定义了一个状态机,我正在记录它从它首次出现在我的系统中到我处置它时发生的事情。
为了演示我正在努力解决的问题,我创建了一个测试 REST 应用程序并在GitHub 存储库上提供了它。
该应用程序跟踪文章的生命周期,文章可以通过以下方式进入系统:
- 一篇文章被直接添加并链接到一个出版物 - 简而言之,它被接受
- 添加了一篇文章提案 - 简而言之,它是PROPOSED
- 可以接受提出的文章以添加到出版物中-简而言之,它是ACCEPT_PROPOSAL
有关更多详细信息,请查看public enum ProcessAction
.
如何重现
- 克隆仓库
- 创建数据库和用户 - 创建 SQL 代码包含在注释中
TestDbContext.cs
- 运行数据库迁移
- 启动应用程序
TestsController.cs
按照出现的顺序调用所有端点- 这里是直接链接 (HTTP GET
):- Mew 出版物:http://localhost:5000/tests/publication/add?name=New%20Publication
- 添加文章:http://localhost:5000/tests/article/add?type=ReviewArticle&title=Test%20article%202018¬e=My%20test%20note&publicationId=1
- 提出一篇文章:http://localhost:5000/tests/proposal/add?type=ReviewArticle&title=Test proposal 1¬e=Proposal%20note%201
- 接受文章提议(注意:文章 ID 在您的系统上可能不同):http://localhost:5000/tests/accept/1?publicationId=2
问题
最后一次调用抛出以下异常:
InvalidCastException: Unable to cast object of type 'si.dezo.test.DotNetAudit.Models.Article' to type 'si.dezo.test.DotNetAudit.Models.ArticleProposal'.
我注释掉了里面的几行代码,
TestDbContext.cs
并标记为注意:以下不起作用
我做错了什么还是图书馆的限制或错误?
有没有办法解决这个问题?
解决方案
问题是该库仅支持每种目标类型(审计类型)的一个操作。
当你.Map
用这样的动作打电话时:
.Map<Article, Audit_Article>((evt, entry, auditTbl) => { /*some action*/ })
它将存储与 type 相关的操作Audit_Article
,但您的下一个调用:
.Map<ArticleProposal, Audit_Article>((item, auditTbl) => { /*overriding action*/ })
将覆盖您之前对映射到的任何类型的操作Audit_Article
。
所以我最初的建议是通过.AuditEntityAction<IAudit>
. 这会给你带来什么问题吗?
我认为可以扩展库以允许将多个类型映射到相同的目标类型,每个类型都有独立的操作。我会看看。
更新
这已在 Audit.EntityFramework 版本 13.2.0 上实现,您现在可以将多个实体映射到相同的审计类型,每个实体都有独立的操作。
推荐阅读
- java - 如何获得下一小时的毫秒数
- marklogic - 动态设置 ml-gradle 属性
- angular - Angular 6 将数据发布到休息 API 但返回错误 500
- javascript - 多次调用 Socket.io 事件侦听器,即使它仅从我的节点 js 服务器发出一次
- python - 如何在 MacOS Sierra/High Sierra 中使用 python 获取用户设置的计算机名称
- c++ - 读取 cin 但从文件读取时超出运行时间?
- android - 按每个卡片视图中的数字排序卡片视图
- r - 针对 mu 值的具有随机效应的多个单样本比较
- flex-lexer - 使用 lex 将输入与字符串匹配
- xaml - Xamarin.Forms 中的 Listview XAML 按钮