при выполнении кода ниже с (потенциально) большим набором Buckets я получаю исключение, которое гласит:
Соединение уже в транзакции и не может участвовать в другой транзакции , EntityClient не поддерживает параллельные транзакции.
Насколько я понимаю, я специально не заявляю, что этот код должен выполняться параллельно для каждой транзакционной вставки, так как я могу убедиться, что это действительно так? во избежание исключения?
public Task<Bucket> AddAsync(Bucket result)
{
using var t = Db.BeginTransaction();
try
{
await Db.AddAllAsync(result.Roles.Select(r => r.Role).ToArray());
if (inheritedRoles != null) result.Roles = result.Roles.Union(inheritedRoles).ToList();
var stuff = new { result.Roles, result.Systems, result.Companies };
result.Roles = null;
result.Systems = null;
result.Companies = null;
result = await base.AddAsync(result);
if (stuff.Roles != null) result.Roles = await Db.AddAsync(stuff.Roles);
if (stuff.Systems != null) result.Systems = await Db.AddAsync(stuff.Systems);
if (stuff.Companies != null) result.Companies = await Db.AddAsync(stuff.Companies);
t.Commit();
}
catch { t.Rollback(); throw; }
return result;
}
public virtual async Task<IEnumerable<Result<Bucket>>> AddAllAsync(IEnumerable<Bucket> items)
{
var results = new List<Result<T>>();
// call the most specific instance of add for each to ensure all the add rules get implemented
foreach (var item in items)
{
try
{
results.Add(new Result<T> { Success = true, Item = await AddAsync(item), Message = "Added Successfully" });
}
catch (Exception ex)
{
results.Add(new Result<T> { Success = false, Item = item, Message = ex.Message });
}
}
return results;
}
Странно, это работает при вызове вышеупомянутым добавить все asyn c logi c таким же образом `` `cs
public override async Task<T> AddAsync(T transaction)
{
try
{
...
// https://docs.microsoft.com/en-us/ef/core/saving/transactions
using var t = Db.BeginTransaction();
var result = await base.AddAsync(transaction);
result.References = await Db.AddAllAsync(references);
result.Companies = await Db.AddAllAsync(companies);
result.Lines = await Db.AddAllAsync(lines);
result.Buckets = await Db.AddAllAsync(bucks);
result.AuditTrail = await Db.AddAllAsync(auditTrail);
t.Commit();
return result;
}
catch (Exception ex)
{
log.Error(ex);
throw;
}
}