首页 > 解决方案 > 审计从多个表到单个 EF 审计表的日志记录时出现无效的强制转换异常

问题描述

我的应用程序使用Audit.NETwithAudit.EntityFramework来审计日志数据更改。为了便于创建审计日志/数据更改可视化,我决定将几个表的更改记录到一个表中。长话短说:我为我的项目定义了一个状态机,我正在记录它从它首次出现在我的系统中到我处置它时发生的事情。

为了演示我正在努力解决的问题,我创建了一个测试 REST 应用程序并在GitHub 存储库上提供了它。

该应用程序跟踪文章的生命周期,文章可以通过以下方式进入系统:

有关更多详细信息,请查看public enum ProcessAction.

如何重现

  1. 克隆仓库
  2. 创建数据库和用户 - 创建 SQL 代码包含在注释中TestDbContext.cs
  3. 运行数据库迁移
  4. 启动应用程序
  5. TestsController.cs按照出现的顺序调用所有端点- 这里是直接链接 ( HTTP GET):
    1. Mew 出版物:http://localhost:5000/tests/publication/add?name=New%20Publication
    2. 添加文章:http://localhost:5000/tests/article/add?type=ReviewArticle&title=Test%20article%202018¬e=My%20test%20note&publicationId=1
    3. 提出一篇文章:http://localhost:5000/tests/proposal/add?type=ReviewArticle&title=Test proposal 1¬e=Proposal%20note%201
    4. 接受文章提议(注意:文章 ID 在您的系统上可能不同):http://localhost:5000/tests/accept/1?publicationId=2

问题

  1. 最后一次调用抛出以下异常:

    InvalidCastException: Unable to cast object of type
    'si.dezo.test.DotNetAudit.Models.Article' to type
    'si.dezo.test.DotNetAudit.Models.ArticleProposal'.
    
  2. 我注释掉了里面的几行代码,TestDbContext.cs并标记为

    注意:以下不起作用

我做错了什么还是图书馆的限制或错误?

有没有办法解决这个问题?

标签: ef-core-2.1audit.net

解决方案


问题是该库仅支持每种目标类型(审计类型)的一个操作。

当你.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 上实现,您现在可以将多个实体映射到相同的审计类型,每个实体都有独立的操作。


推荐阅读