gpt4 book ai didi

c# - EF 中的事务性 SaveChangesAsync

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:07 24 4
gpt4 key购买 nike

我想以事务方式将更改保存到数据库中的实体 Person 列表。我已经实现了该功能,但我不知道是否必须将 await Task.WhenAll(tasks); 包装在 TransactionScope 中,或者我的代码已经足以获取它。

    public class MyService {

public MyContext Context { get; }

public MyService(
IDatabaseInitializer<MyContext> initializer
) {
Context = new MyContext(initializer);
}

public async Task<int> AddOrUpdateDataAsync(IEnumerable<Person> persons)
{
List<Task> tasks = new List<Task>();
try
{
foreach (Person person in persons)
{
person.Status = Status.Finish;
person.Changed = DateTime.Now;
person.Role = Role.Worker;
MyContext.Persons.AddOrUpdate(person);
tasks.Add(await MyContext.SaveChangesAsync(););
}

await Task.WhenAll(tasks);
return 1;
}
catch (EntityCommandExecutionException ex)
{
return 0;
}
}

}

最佳答案

除非您完全确定自己在做什么,否则我不建议您通过返回 0 来处理异常。我总是更喜欢在最外层堆栈处理异常并记录异常,然后采取适当的措施。如果可能的话,我建议你使用错误处理中间件(这取决于你使用的框架、你使用的方法以及情况)。

另一方面,您不需要一个一个地更新每个对象。完成所有操作后,您可以调用 SaveChangesAsync

try
{
foreach (Person person in persons)
{
person.Status = Status.Finish;
person.Changed = DateTime.Now;
person.Role = Role.Worker;
MyContext.Persons.AddOrUpdate(person);
}

var affectedRows = await MyContext.SaveChangesAsync();
return (int)(persons.Count == affectedRows);
}
catch (EntityCommandExecutionException ex)
{
return 0;
}

关于c# - EF 中的事务性 SaveChangesAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com