从多个表到单个EF审计表的审计日志记录时,无效的强制转换异常

时间:2018-10-29 23:42:30

标签: ef-core-2.1 audit.net

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

为了演示我所遇到的问题,我创建了一个测试REST应用程序并将其在GitHub repository上发布。

应用程序跟踪文章的生存期,通过以下方式可以将文章发布到系统中:

  • 直接添加文章并将其链接到出版物-简而言之,它是已接受
  • 添加了文章提案-简而言之,它是已提案
  • 可以接受将提议的文章添加到出版物中-简而言之,它是 ACCEPT_PROPOSAL

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

如何繁殖

  1. 克隆存储库
  2. 创建数据库和用户-创建SQL代码包含在TestDbContext.cs的注释中
  3. 运行数据库迁移
  4. 启动应用程序
  5. 按照出现的顺序从TestsController.cs呼叫所有端点-这是直接链接(HTTP GET):
    1. 出版很少:http://localhost:5000/tests/publication/add?name=New%20Publication
    2. 添加文章:http://localhost:5000/tests/article/add?type=ReviewArticle&title=Test%20article%202018&note=My%20test%20note&publicationId=1
    3. 提出一篇文章:http://localhost:5000/tests/proposal/add?type=ReviewArticle&title=Test提案1&note = 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中注释了几行代码,并将其标记为

      

    注意:以下内容不起作用

我是在做错什么,还是库的限制或错误?

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

1 个答案:

答案 0 :(得分:1)

问题是该库对于每种目标类型(审核类型)仅支持一项操作。

当您通过以下操作呼叫.Map时:

.Map<Article, Audit_Article>((evt, entry, auditTbl) => { /*some action*/ })

它将存储与类型Audit_Article相关的操作,但您的下一个呼叫是

.Map<ArticleProposal, Audit_Article>((item, auditTbl) => { /*overriding action*/ })

对于映射到Audit_Article的任何类型,它都会覆盖您之前的操作。

因此,我最初的建议是通过.AuditEntityAction<IAudit>使用常见操作。这会给您带来任何问题吗?

我认为可以扩展该库,以允许将多个类型映射到同一目标类型,并且每个目标类型具有独立的动作。我会看看。

更新

这已在Audit.EntityFramework版本13.2.0上实现,现在您可以使多个实体映射到同一审计类型,并且每个实体具有独立的操作。