如何从实体框架 6 中的 Auditlog 实体获取 id

2024-05-10

我知道那里有几个类似的帖子,但我找不到任何解决此问题的帖子。

我想在实体框架 6 中添加、更改或删除实体(软删除)时添加(某种)AudioLog。我已经覆盖了 SaveChanges,因为我只想为添加、修改或删除的 EntityStates 添加日志条目,我在第一次调用 SaveChanges 之前获取列表。问题是,因为我需要记录已执行的操作,所以我需要检查实体的 EntityState。但是在调用 SaveChanges 后,所有条目的 EntityState 都保持不变。

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var modifiedEntries = ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Deleted || e.State == EntityState.Modified)
            .ToList();

        int changes = base.SaveChanges();
        foreach (var entry in modifiedEntries)
        {
            ApplyAuditLog(entry);
        }

        base.SaveChanges();
        scope.Complete();
        return changes;
    }
}

private void ApplyAuditLog(DbEntityEntry entry)
{
    ILog entity = entry.Entity as ILog;

    if (entity != null)
    {
        LogOperation operation;
        switch (entry.State)
        {
            case EntityState.Added:
                operation = LogOperation.CreateEntity;
                break;
            case EntityState.Deleted:
                operation = LogOperation.DeleteEntity;
                break;
            case EntityState.Modified:
                operation = LogOperation.UpdateEntity;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }

        AuditLog log = new AuditLog
        {
            Created = DateTime.Now,
            Entity = entry.Entity.GetType().Name,
            EntityId = entity.Id,
            Operation = operation,
        };

        AuditLog.Add(log);
    }
}

啊啊……当然啦!!对于新添加的实体来说,id 只会成为一个“问题”,因此通过将列表分为两部分(一个用于修改/删除,一个用于添加),我分两个阶段创建 AuditLog。

对于想要应用这种 AuditLog 的其他人,这是我的工作代码:

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
        var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted || e.State == EntityState.Modified).ToList();

        foreach (var entry in modifiedEntries)
        {
            ApplyAuditLog(entry);
        }

        int changes = base.SaveChanges();
        foreach (var entry in addedEntries)
        {
            ApplyAuditLog(entry, LogOperation.CreateEntity);
        }

        base.SaveChanges();
        scope.Complete();
        return changes;
    }
}

private void ApplyAuditLog(DbEntityEntry entry)
{
    LogOperation operation;
    switch (entry.State)
    {
        case EntityState.Added:
            operation = LogOperation.CreateEntity;
            break;
        case EntityState.Deleted:
            operation = LogOperation.DeleteEntity;
            break;
        case EntityState.Modified:
            operation = LogOperation.UpdateEntity;
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }

    ApplyAuditLog(entry, operation);
}

private void ApplyAuditLog(DbEntityEntry entry, LogOperation logOperation)
{
    ILog entity = entry.Entity as ILog;

    if (entity != null)
    {
        AuditLog log = new AuditLog
        {
            Created = DateTime.Now,
            Entity = entry.Entity.GetType().Name,
            EntityId = entity.Id,
            Operation = logOperation,
        };
        AuditLog.Add(log);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从实体框架 6 中的 Auditlog 实体获取 id 的相关文章

随机推荐

  • IIS AppPool 用户权限不起作用

    我正在 Win2012 R2 上将 PHP 应用程序从 IIS7 移动到 IIS8 5 该应用程序在其自己的应用程序池 MyPortal 中运行 并且需要子文件夹的写入权限才能创建 PDF 所以我将修改或完全控制权限分配给IIS 应用程序池
  • 使用本地图块的 TileProvider

    我想使用新的TileProvider最新 Android Maps API v2 的功能可在地图上覆盖一些自定义图块GoogleMap 然而 由于我的用户很多时候都没有互联网 我想将图块存储在设备上的 zip 文件 文件夹结构中 我将使用生
  • 使用 Command + P 搜索文件时,Apple M1 Pro 上的 VS Code 速度非常慢

    我正在运行 VS Code 1 70 2 并一直在使用 SSH 远程扩展来连接到本地 Linux 服务器的代码库 多年来Command P文件搜索功能非常快 在大型代码库中是一个非常方便的工具 但在过去 2 周内 该功能已停止运行 执行文件
  • ASP.Net Core 2.0 SignInAsync 返回异常值不能为 null,提供程序

    我有一个 ASP Net Core 2 0 Web 应用程序 我正在使用单元测试 使用 NUnit 进行改造 该应用程序运行良好 并且迄今为止的大多数测试都运行良好 但是 测试身份验证 授权 用户是否登录并可以访问 Authorize 过滤
  • C++ 中 const 的优点? [复制]

    这个问题在这里已经有答案了 有什么优点const http en wikipedia org wiki Const correctness对于外行来说 用 C 和 C 语言 Const 对于传递给函数的指针或引用特别有用 它是一种可以立即理
  • SQL:使用相等的键和最近的键进行连接(类似于 Pandas 的合并)

    例如 我有2个这样的表 对于表 1 中的每一行 我想获取该行 same customer id and nearest date 就我而言 table2 date lt table1 date 结果应该是这样的 我怎样才能在 SQL 中做到
  • 该捆绑包无效。 Apple 目前不接受使用此版本操作系统构建的应用程序。 (小牛队)

    我首先说我已经安装了 Mavericks 我很好奇看到新功能 最好还是等待 因为 显然 没有什么耸人听闻的变化 无论如何 我正在尝试将我的应用程序提交到应用程序商店 但经过与代码签名的真正艰苦斗争后 我最终得到了以下消息 此捆绑包无效 Ap
  • 如何在 Vanilla JS 中使用 Apollo Client 创建 GraphQL 订阅

    最近 Apollo Client 发布了 websocket 订阅功能 但到目前为止我只看到它通过在 componentWillMount 生命周期钩子中使用 subscribeToMore 启动查询来使用 这是一个来自的例子https d
  • mvc 中的模型(最佳实践,PHP)

    我知道有很多关于 MVC 和最佳实践的文章和问题 但我找不到这样的简单示例 假设我必须用 PHP 开发一个 Web 应用程序 我想遵循 MVC 模式 没有框架 该应用程序应该有一个简单的书籍 CRUD 我想从控制器获取我商店中的所有书籍 保
  • Python 3 - 编码/解码与字节/Str [重复]

    这个问题在这里已经有答案了 我是 python3 的新手 来自 python2 我对 unicode 基础知识有点困惑 我读过一些很好的帖子 这让一切变得更加清晰 但是我看到 python 3 上有两种方法可以处理编码和解码 但我不确定使用
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • 使用 versioneer 和 GitHub 更新版本号

    我在用versioneer适用于多个 GitHub 托管的 Python 项目 看来 versioneer 已安装并且工作正常 我可以调用project version 但是我忘记了如何更新版本号的过程 如果有什么东西在setup cfg
  • 解决复合赋值中的转换警告

    在我的代码中有很多variable lt lt 1 句子哪里variable类型为 uint16 t 编译器发出警告说 从 int 转换为 uint16 t 可能会改变其值 Wconversion 我该如何解决 我可以使用长格式的符号 例如
  • Java 相当于不变文化

    我正在将以下 C 代码转换为 Java Java 中是否存在与 NET 中的文化不变概念相当的概念 string upper myString ToUpperInvariant 由于不变文化实际上只是美国文化 我可以在 Java 中做类似的
  • laravel Blade 模板不渲染

    进入 Laravel 后 我尝试使用 Blade 模板 但它没有渲染 我的所有示例都来自 Laravel 文档 UPDATE 所以这是我的master blade php 文件位于资源 gt 视图 gt master blade php y
  • svn:修订版本中不存在路径

    我想在颠覆中创建标签 在命令行上我尝试了以下操作 svn复制http myserver mycompany com 8080 svn SVN Main trunk http myserver mycompany com 8080 svn S
  • Ruby 对象打印为指针

    我正在尝试创建一个类 它有一个带有单个参数的构造函数 当我创建该对象的新实例时 它返回一个指针 class Adder def initialize my num my num my num end end y Adder new 12 p
  • GAE是无状态的吗?有什么影响?

    我曾经被告知 GAE 是无国籍的 我总体上理解无状态的概念 但我可以使用一些指导来从概念上将其应用于 GAE 类型的系统 我专门问这个问题是因为我开发的一个应用程序似乎存在干扰问题 也就是说 当两个或更多人同时使用它时 它就会变得混乱 我正
  • 调整回形针大小以适合矩形框

    我有一个矩形图像 例如 30x800 像素 如何用回形针缩放它以保留 100x100 像素图像的纵横比 并用边框填充空白区域 一个例子 http www imagemagick org Usage thumbnails pad extent
  • 如何从实体框架 6 中的 Auditlog 实体获取 id

    我知道那里有几个类似的帖子 但我找不到任何解决此问题的帖子 我想在实体框架 6 中添加 更改或删除实体 软删除 时添加 某种 AudioLog 我已经覆盖了 SaveChanges 因为我只想为添加 修改或删除的 EntityStates