Asp.net core 实体框架核心验证保存更改计数

Asp.net core 实体框架核心验证保存更改计数,asp.net-core,entity-framework-core,asp.net-core-3.1,ef-core-3.1,entity-framework-core-3.1,Asp.net Core,Entity Framework Core,Asp.net Core 3.1,Ef Core 3.1,Entity Framework Core 3.1,我被分配了一项任务,用SaveChanges()验证所做更改的数量。 当调用SaveChanges()时,开发人员应该知道将更改多少记录 为了实现它,我为DbContext创建了一个名为SaveChangesAndVerify(int expectedchangecont)的扩展方法,在这里我使用事务并将此参数与SaveChanges()的返回值相等。 如果值匹配,则提交事务;如果不匹配,则回滚事务 请检查下面的代码,让我知道它是否会工作,如果有任何考虑,我需要作出。还有,有没有更好的方法来做到

我被分配了一项任务,用
SaveChanges()
验证所做更改的数量。 当调用
SaveChanges()
时,开发人员应该知道将更改多少记录

为了实现它,我为
DbContext
创建了一个名为
SaveChangesAndVerify(int expectedchangecont)
的扩展方法,在这里我使用事务并将此参数与
SaveChanges()的返回值相等。
如果值匹配,则提交事务;如果不匹配,则回滚事务

请检查下面的代码,让我知道它是否会工作,如果有任何考虑,我需要作出。还有,有没有更好的方法来做到这一点

public static class DbContextExtensions
{
    public static int SaveChangesAndVerify(this DbContext context, int expectedChangeCount)
    {
        context.Database.BeginTransaction();
        var actualChangeCount = context.SaveChanges();
        if (actualChangeCount == expectedChangeCount)
        {
            context.Database.CommitTransaction();
            return actualChangeCount;
        }
        else
        {
            context.Database.RollbackTransaction();
            throw new DbUpdateException($"Expected count {expectedChangeCount} did not match actual count {actualChangeCount} while saving the changes.");
        }
    }

    public static async Task<int> SaveChangesAndVerifyAsync(this DbContext context, int expectedChangeCount, CancellationToken cancellationToken = default)
    {
        await context.Database.BeginTransactionAsync();
        var actualChangeCount = await context.SaveChangesAsync();
        if(actualChangeCount == expectedChangeCount)
        {
            context.Database.CommitTransaction();
            return actualChangeCount;
        }
        else
        {
            context.Database.RollbackTransaction();
            throw new DbUpdateException($"Expected count {expectedChangeCount} did not match actual count {actualChangeCount} while saving the changes.");
        }
    }
}
公共静态类DbContextensions
{
公共静态int-SaveChangesAndVerify(此DbContext上下文,int-expectedChangeCount)
{
context.Database.BeginTransaction();
var actualchangecont=context.SaveChanges();
如果(实际更改计数==预期更改计数)
{
context.Database.CommitTransaction();
返回实际更改计数;
}
其他的
{
context.Database.RollbackTransaction();
抛出新的DbUpdateException($“保存更改时,预期计数{expectedChangeCount}与实际计数{actualChangeCount}不匹配。”);
}
}
公共静态异步任务SaveChanges和VerifySync(此DbContext上下文,int expectedChangeCount,CancellationToken CancellationToken=default)
{
wait context.Database.BeginTransactionAsync();
var actualchangecont=await context.saveChangesSync();
如果(实际更改计数==预期更改计数)
{
context.Database.CommitTransaction();
返回实际更改计数;
}
其他的
{
context.Database.RollbackTransaction();
抛出新的DbUpdateException($“保存更改时,预期计数{expectedChangeCount}与实际计数{actualChangeCount}不匹配。”);
}
}
}
示例用法类似于
context.savechanges和verify(1)
,其中开发人员只希望更新一条记录。

确定一些要点

  • 除非您已禁用它,否则
    SaveChanges
    将作为事务工作。如果有任何事情失败,什么都不会改变
此外,还可以使用
context.ChangeTracker.Entries()
从中获得已更改实体的数量。因此,这将不需要您处理事务。另外,
SaveChanges()
只需返回受影响的行数,这样就可能无法说明全部情况

一般来说,我不喜欢从项目架构的角度进行这种检查,这会增加动态更改代码的复杂性,并且只会增加复杂性,而不会带来任何安全性或安全性。数据完整性和正确的行为应该使用单元测试来验证,而不是那些类型的方法。例如,您可以添加单元测试,以验证更改的行是否与预期的行相同。但这应该是测试代码。不是将要交付生产的代码


但如果您需要这样做,在更改任何内容之前,不要使用事务和计算实体,因为这样更便宜。您甚至可以使用“便宜”的forloop,以便记录哪些实体失败等等。此外,由于我们对开发人员进行监管,因此您可以使用扩展,这意味着开发人员可以自由使用
SaveChanges()
。您应该为DbContext创建一个新的自定义类,并仅公开这两种保存更改的方法。

如果代码正常工作,您也可以将其发布在代码审阅网站上:是的,会这样做的,请花时间回答。肯定会检查context.ChangeTracker.Entries()