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

10-10 20:00