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()