首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EF2.2 Core 2.2审计返回相同的新旧值如何修复?

EF2.2 Core 2.2是指Entity Framework Core 2.2版本,而审计返回相同的新旧值是指在使用该版本的Entity Framework Core进行审计时,新旧值返回相同的问题。修复这个问题的方法是通过配置ChangeTracker的属性来解决。

首先,需要在DbContext的OnModelCreating方法中配置ChangeTracker的属性,将其设置为返回更多的信息。可以使用以下代码:

代码语言:txt
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
    ChangeTracker.AutoDetectChangesEnabled = true;
    ChangeTracker.LazyLoadingEnabled = true;
    ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges;
}

上述代码中,将QueryTrackingBehavior设置为TrackAll,表示跟踪所有查询,AutoDetectChangesEnabled设置为true,表示自动检测更改,LazyLoadingEnabled设置为true,表示启用延迟加载,CascadeDeleteTiming设置为OnSaveChanges,表示在保存更改时级联删除。

接下来,可以在需要进行审计的实体类中,重写SaveChanges方法,在保存更改之前,通过ChangeTracker.Entries方法获取所有被修改的实体,然后可以比较新旧值,进行相应的处理。以下是一个示例代码:

代码语言:txt
复制
public override int SaveChanges()
{
    var modifiedEntities = ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Modified)
        .ToList();

    foreach (var entityEntry in modifiedEntities)
    {
        var originalValues = entityEntry.OriginalValues.Clone();
        var currentValues = entityEntry.CurrentValues.Clone();

        // 比较新旧值并进行处理
        // ...

        // 更新实体的状态
        entityEntry.State = EntityState.Modified;
    }

    return base.SaveChanges();
}

在上述代码中,通过ChangeTracker.Entries方法获取所有被修改的实体,并使用OriginalValues和CurrentValues属性获取实体的原始值和当前值。然后可以比较新旧值,并进行相应的处理。最后,将实体的状态设置为Modified,以确保更改被保存。

需要注意的是,以上代码只是一个示例,具体的比较和处理逻辑需要根据实际情况进行调整。

关于Entity Framework Core的更多信息和使用方法,可以参考腾讯云的相关产品和文档:

  • 腾讯云数据库SQL Server版:https://cloud.tencent.com/document/product/238/4473
  • 腾讯云数据库MySQL版:https://cloud.tencent.com/document/product/236/3130
  • 腾讯云数据库PostgreSQL版:https://cloud.tencent.com/document/product/409/16773

请注意,以上链接仅供参考,具体的产品和文档可能会有更新和调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何运用领域驱动设计 - 存储库

在上一篇文章中,我们已经了解过领域驱动设计中一个很核心的对象-聚合。在现实场景中,我们往往需要将聚合持久化到某个地方,或者是从某个地方创建出聚合。此时就会使得领域对象与我们的基础架构产生紧密的耦合,那么我们应该怎么隔绝这一层耦合关系,使它们自身的职责界限更加清晰呢?是的,这就要用到我们今天要讲的内容 - 存储库。在很多地方,我们喜欢叫它为仓储,特别是在现有的AspNetCore应用中,大量的应用都在引入Repository这种东西。那么究竟什么是存储库呢?我们现在的使用方式是正确的吗?它在领域驱动设计中又扮演着怎样的角色呢?本文将从不同的角度来带大家重新认识一下“存储库”这个概念,并且给出相应的代码片段(本教程的代码片段都使用的是C#,后期的实战项目也是基于 DotNet Core 平台)。

03

Entity Framework Core 捕获数据库变动

在实际项目中我们往往需要记录存储在数据库中数据的变动(例如修改数据前记录下数据的原始值),这样一来在发生误操作时可以将数据恢复到变动前的状态,也可以追溯到数据的修改人。大部分开发人员会自己定义记录数据变动的代码,但是这样不仅费时费力有时还会影响到这个业务的性能。当然,我们也可以利用数据库触发器来记录这些操作,在 SQL Server 数据库 2017 以上版本中给我们提供了跟踪数据库数据更改的功能,利用这个功能可以准确的记录数据库数据的变动。这个功能虽然强大但是某些时候我们使用的数据库并不是 SQL Server 数据库,或者某些情况下我们不适合使用 SQL Server 数据库所提供的这个功能。那么这个时候该怎么办呢?如果你使用的是 Entity Framework Core 2.0 及以上版本来开发项目的话,那这个问题就好解决了。在 Entity Framework Core 中,只要捕获到了数据变更记录,我们就可以将数据随时还原到变更前的状态,在这里数据库变更记录被称为审计数据。那么我们先来看两个问题:

01
  • abp vnext2.0核心组件之DDD组件之实体结构源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备,接下去就是构建领域层,vnext整个领域层大致分为聚合根、实体、值对象、事件实体、仓储、服务等等,内容较多,所以我打算分随笔进行介绍.首先介绍领域实体。注:这边所说的实体,是abp团队提供的抽象.如果不了解领域相关的知识,建议阅读<<领域驱动设计:软件核心复杂性应对之道>>需要一定设计模式的功底.如果设计模式不了解,请移步本人的设计模式分类.我也是略懂,所以本文有不当之处,请指正!谢谢!另外提一点,贫血的领域模型和充血的领域模型有本质的区别.有兴趣的可以研究研究,后续有时间我也会补充随笔,大家一起来探讨.

    01

    从ASP.NET Core2.2到3.0你可能会遇到这些问题

    趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识。我们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019。So,就用vs2019+.NET Core3.0来跟着做一下Contoso University这个WEB应用,但是在基于3.0进行操作的时候遇到了一些问题,所以我就查看了微软的《从 ASP.NET Core 迁移 2.2 到 3.0 预览版 2》这篇文档,就着今天遇到的问题,所以我整理下,希望对大伙有所帮助,当然大伙也可以直接阅读微软的官方文档进行查看。但是我在阅读官方说明的时候,总感觉翻译的不是很准确,读起来很拗口,所以这里我是自己的理解对官方文档的一个补充。

    02

    【ASP.NET Core 基础知识】--数据库连接--使用Entity Framework Core进行数据库访问

    Entity Framework Core(简称EF Core)是微软推出的一个轻量级版的Entity Framework,它是一个开源的、跨平台(Windows、Linux和macOS)的对象关系映射(ORM)框架。EF Core 旨在提供快速的数据访问和强大的数据库操作功能,同时保持较低的资源占用。 EF Core 支持与多种数据库系统的集成,包括 SQL Server、SQLite、MySQL、PostgreSQL 和 Oracle 等。它提供了 Code First 开发方法,允许开发人员通过代码来定义模型、配置映射关系和创建数据库。此外,EF Core 还支持数据迁移,使得在开发过程中数据库模式的变更更加容易管理和部署。 EF Core 与传统的 Entity Framework (EF) 相比,具有以下特点:

    00
    领券