我的应用程序使用Audit.NET
和Audit.EntityFramework
来审核日志记录数据更改。为了便于创建审核日志/数据更改可视化,我决定将更改从几个表记录到一个表中。长话短说:我为项目定义了一个状态机,并记录了从状态机首次出现在系统中到处置之前的状态。
为了演示我所遇到的问题,我创建了一个测试REST应用程序并将其在GitHub repository上发布。
应用程序跟踪文章的生存期,通过以下方式可以将文章发布到系统中:
有关更多详细信息,请检查public enum ProcessAction
。
TestDbContext.cs
的注释中TestsController.cs
呼叫所有端点-这是直接链接(HTTP GET
):
最后一次调用引发以下异常:
InvalidCastException: Unable to cast object of type
'si.dezo.test.DotNetAudit.Models.Article' to type
'si.dezo.test.DotNetAudit.Models.ArticleProposal'.
我在TestDbContext.cs
中注释了几行代码,并将其标记为
注意:以下内容不起作用
我是在做错什么,还是库的限制或错误?
有没有办法解决这个问题?
答案 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上实现,现在您可以使多个实体映射到同一审计类型,并且每个实体具有独立的操作。