通过迁移创建动态审计表

2023-12-13

使用 .Net Core 2.1 和 Audit.NET EF 12.1.10,我尝试添加包含审核表的迁移,但调用 Add-Migration 时,迁移中不会生成审核表。我假设使用“动态”审核会自动完成此操作。我没有任何审计接口——我将其留给 Audit.NET。以下是我的启动项:

var serviceProvider = services.BuildServiceProvider();

        Audit.EntityFramework.Configuration.Setup()
            .ForContext<MainDbContext>(config => config
                .IncludeEntityObjects()
                .AuditEventType("{context}:{database}"))
            .UseOptOut()
            .IgnoreAny(entity => entity.Name.StartsWith("AspNet") && entity.Name.StartsWith("OI"));


        Audit.Core.Configuration.Setup()
            .UseEntityFramework(ef => ef
                .AuditTypeNameMapper(typeName => "Audit_" + typeName)
                .AuditEntityAction((evt, entry, auditEntity) =>
                {
                    // Get the current HttpContext 
                    var httpContext = serviceProvider.GetService<IHttpContextAccessor>().HttpContext;

                    // Store the identity name on the "UserName" property of the audit entity
                    ((dynamic)auditEntity).UserName = httpContext.User?.Identity.Name;
                    ((dynamic)auditEntity).AuditDate = DateTime.UtcNow;
                    ((dynamic)auditEntity).AuditAction = entry.Action;
                }));

我的 DbContext 从 Audit IdentityDbContext 扩展:

public class MainDbContext : AuditIdentityDbContext<User, Role, string>

到目前为止,我只有一个名为 Activity 的实体,只是为了测试这一点,我希望 Add-Migrations 包含 Audit_Activity 表和 Activity 表,但我只得到了后者。不确定我在这里做错了什么。


我尝试审核身份角色只是因为它目前最容易测试

public class ApplicationRole : IdentityRole
{
}

public class Audit_ApplicationRole : IAudit
{
    [Key]
    public string Id { get; set; }
    [Column(TypeName = "NVARCHAR(256)")]
    public string Name { get; set; }
    [Column(TypeName = "NVARCHAR(256)")]
    public string NormalizedName { get; set; }
    public string ConcurrencyStamp { get; set; }
    public ApplicationRole Role { get; set; }
    public string RoleId  { get; set; }
    [Column(TypeName = "VARCHAR(100)")]
    public string AuditUser { get; set; }
    public DateTime AuditDate { get; set; }
    [Column(TypeName = "VARCHAR(7)")]
    public string Action { get; set; } // "Insert", "Update" or "Delete"
}

public interface IAudit
{
    string AuditUser { get; set; }
    DateTime AuditDate { get; set; }
    string Action { get; set; } 
}

然后我在 StartUp.cs 中使用了你的代码

        Audit.EntityFramework.Configuration.Setup()
            .ForContext<ApplicationDbContext>(config => config
                .IncludeEntityObjects()
                .AuditEventType("{context}:{database}"));

        Audit.Core.Configuration.Setup()
            .UseEntityFramework(x => x
                .AuditTypeNameMapper(typeName => "Audit_" + typeName)
                .AuditEntityAction<IAudit>((ev, ent, auditEntity) =>
                {
                    auditEntity.AuditDate = DateTime.UtcNow;
                    auditEntity.AuditUser = ev.Environment.UserName;
                    auditEntity.Action = ent.Action;
                }));

我发现由于某种原因 Id 必须是字符串,它不能是整数。

链接的屏幕截图显示数据更改已保存。

在此输入图像描述

顺便说一句,我想保存通过身份登录的用户,所以如果有人想知道,这篇文章帮助我实现了这一目标。https://entityframeworkcore.com/knowledge-base/49799223/asp-net-core-entity-changing-history

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过迁移创建动态审计表 的相关文章

  • 如何使用OpenCV裁剪圆形图像?

    我想知道 openCV 中是否有一种方法可以让我在两个圆之间裁剪图像 从而忽略较小内圆中的所有内容和较大圆之外的所有内容 就像甜甜圈的形状 这是在 Python OpenCV 中执行此操作的一种方法 读取输入并获取其尺寸 定义两个圆的半径和
  • 右键单击节点上的 JTree 和下拉选项

    我正在尝试使用 JTree 并为所有父节点和子节点实现不同的下拉列表 这是我所做的 pmTree addMouseListener new java awt event MouseAdapter Override public void m
  • 我无法在 .net (vb.net) webbrowser 控件中使用 websocket

    我正在尝试在 Webbrowser 控件内运行网页 其中包含与 Websocket 的连接 该控件无法连接到 Websocket 当我在IE中测试时 一切运行正常 但在Visual Studio内的Webbrowser控件中 页面无法连接到
  • 在未连接的计算机上使用 git

    我有时会在两台未连接的计算机上进行开发的项目 一个典型的例子是在 BIDS 中创建报告 工作流程如下所示 我在公司 TFS 中创建一个项目 文件夹 使用git tfs创建本地git仓库 开发报告并提交到本地存储库 以及一些到 tfs 的签入
  • 在嵌套 JAR 内的文件夹中查找文件名

    当我的应用程序打包为 JAR 时 我无法访问目标文件夹 images 我不是在获取单个文件后 我想要的是 images 文件夹中所有 jpg 文件的列表 我试过这个 URI uri getClass getClassLoader getRe
  • 如果段错误不可恢复,为什么将其称为错误(而不是中止)?

    我对术语的以下理解是这样的 1 中断是由硬件发起的 通知 用于调用操作系统运行其处理程序 2 陷阱是由软件发起的 通知 用于调用操作系统运行其处理程序 3 故障是处理器在发生错误但可恢复时引发的异常 4 中止是处理器在发生错误但不可恢复时引
  • 为什么 ksh 中的以下 IF 条件总是评估为 true?

    考虑一下 下面的代码按预期工作 if SOME VARIABLE TRUE then echo Only echoed when SOME VARIABLE stores string TRUE fi 但是当我删除相等运算符周围的空间时 它
  • struts2中如何禁止缓存?

    在我的 Web 应用程序中 当用户注销时 他不应该访问他之前登录时查看过的页面 但是 由于浏览器缓存 他可以在单击后退按钮时查看这些页面 我定义了一个拦截器来处理这个问题 public String intercept ActionInvo
  • boost::unordered_map 中的迭代器失效

    我在用boost unordered map如下 typedef boost shared ptr
  • 将二进制文件读入字符串

    这一定是显而易见的 但我无法弄清楚 为此我花了几乎一整天的时间 我很乐意给能让我放松的人买瓶啤酒 File file new File filePath byte bytes new byte int file length DataInp
  • R 图频率分布

    如何在 R 中绘制频率分布 我不想对值进行分类 我只想绘制每个值的频率 这hist函数坚持分箱值 除非我手动指定分箱 真的很乏味 因为我事先不知道这些值 你可以plot the table您的数据 xx lt sample 1 10 100

随机推荐

  • 如何从 crm 中的插件注册恢复我的插件数据?

    将程序集更新为插件注册时 在第 2 步 选择要注册的插件和工作流程活动 如果没有选择所有插件 它们将连同插件注册中的步骤和图像一起删除 有没有办法恢复已删除的插件 是否有 XML 或文件可以帮助恢复步骤和图像 如果您有较早的解决方案备份或通
  • 我可以创建从网络上的 UNC 路径复制文件的安装程序吗?

    是否可以创建 Inno Setup 脚本来从网络上的 UNC 路径复制文件 而不是静态地将它们添加到安装文件中 如果是这样 如果我需要先对路径进行身份验证 还可以吗 Inno Setup 脚本中是否有提供身份验证信息的机制 本质上 我希望安
  • Python 导入 MySQLdb 错误 - Mac 10.6

    我下载并按照 MySQL 5 5 8 的安装说明进行操作 http dev mysql com downloads mysql 以及 MySQLdb python 插件 http sourceforge net projects mysql
  • PDO 多个查询:提交和回滚事务

    我需要触发 2 个查询 目前我正在这样做 Begin Transaction this gt db gt beginTransaction Fire Queries if query one gt execute if query two
  • 如何在 Azure 搜索中忽略重音符号?

    Azure 搜索是否支持某种忽略重音字符的方式 例如 如果有人搜索e它应该包括 搜索中的字符 或者我们是否需要在构建 Azure 搜索索引时添加一些转换 欢迎任何建议 谢谢 是的 请在您的现场使用 ASCII 折叠分析仪 为此 请将字段上的
  • Entity Framework 5 和 Amazon RDS - “底层提供程序在 Open 时失败。”

    我有一个 C Entity Framework Web 应用程序 可以在本地 SQL 2012 数据库上正常运行 我将数据库复制到新的 RDS 实例 并且可以通过 Visual Studio 和 SQL Server Management
  • PHP 不区分大小写和重音的数组搜索

    我有一个包含单词的数组 其中一些带有重音符号 我想测试给定的单词是否在该数组中 但使其不区分大小写和重音 例如 array array coche cami n moto carro 我想要一个简单的小功能 比如in array 如果我的字
  • 您可以在 WPF 应用程序中使用 jQuery 吗?

    在过去的几个月里 我一直在创建一个 WPF 应用程序 我想向我的应用程序添加一些动画 之前有人告诉我 jQuery 是一个很好的用于动画的 Javascript 库 问题是 环顾四周后 互联网上没有太多东西让我知道这是否可行 我对 jQue
  • 为什么在访问整数时缓冲区溢出会导致分段错误?

    在函数 A 调用函数 B 期间 B 分配一个 100 个字符的数组并多次填充它 其中一次使用 101 个字符的字符串 一次使用 110 个字符的字符串 这是一个明显的错误 随后 函数 A 尝试访问完全不相关的 int 变量 i 并发生分段错
  • 有关 C# 4.0 中的代码契约的书籍 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 虽然我已经了解代码契约有一
  • Outlook 无法识别 ics 消息

    我正在尝试在 PHP 中创建一个 ics 文件 并将其邮寄给用户 该解决方案在 Gmail 中运行良好 我收到了一份精美的邀请 所有信息都出现在正确的位置 但 Outlook 似乎根本无法识别它 我收到一封没有附件的空电子邮件 据我所知 没
  • Windows 上的卷曲

    我已关注此链接上的所有内容 如何在 Windows 上安装 设置和使用 cURL 但我无法安装最新的curl 7 50 3https curl haxx se download html 在 Windows 7 2008 Server R2
  • 在方向更改时从双窗格切换到单窗格维护片段堆栈

    目前 我在平板电脑上有横向和纵向的双窗格布局 与设置类似 我有一个活动将片段加载到左侧选择窗格中 然后在显示的任何右侧片段中所做的选择都会导致更多片段显示到右侧窗格中 并一直添加到后台堆栈 现在我可以看到 对于某些平板电脑来说 使用一个用于
  • UAC 风格的提升提示

    我有兴趣在临时会话中启动一个窗口 就像 UAC 提示的显示方式一样 有些人对这个概念感兴趣 所以我想我应该在这里问 本质上 我们想要的是一个像UAC 你确定要 提示一样的提升窗口 但具有任意窗口 最终目标是防止窗口事件挂钩以及密码输入期间可
  • 正则表达式在字符串中查找 Youtube 链接[重复]

    这个问题在这里已经有答案了 我有一个这样的字符串 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been
  • 为什么我的 cfloop 在插入第一个 id 后停止?

    我创建了 cfloop 它会执行我在循环上方创建的查询 在循环内部 我有另一个定义值的循环 然后使用 insert 语句进行 cfquery 在尝试将记录插入数据库之前 我测试了循环 一切看起来都很好 当我尝试应用它来插入我的记录后 我的插
  • Rails Cocoon gem 没有错误,也没有输出

    我正在使用 cocoon gem 开发动态嵌套表单 我有两个型号 class CrossTable lt ActiveRecord Base attr accessible title table name database folder
  • Java-Client PHP-Server UDP打洞示例代码

    我正在开发一个需要 ea p2p 服务器的项目 但我还没有找到任何 java client php server 示例代码 我了解 udp 打孔工作原理的概念 但我无法在代码中执行任何操作 我尝试过的 TheSocket java publ
  • 在 Qt-Creator SDK 上以 root 身份运行代码

    我使用 Qt Creator 2 5 2 SDK 在 Linux 上开发 C 代码 当从 SDK 界面 例如 ctrl R 运行代码时 如何以 root 身份运行代码 以 root 身份运行 Qt Creator 的最简单解决方案 老实说
  • 通过迁移创建动态审计表

    使用 Net Core 2 1 和 Audit NET EF 12 1 10 我尝试添加包含审核表的迁移 但调用 Add Migration 时 迁移中不会生成审核表 我假设使用 动态 审核会自动完成此操作 我没有任何审计接口 我将其留给