我想将更改以事务方式保存到数据库中实体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/