EF Core Соединение уже находится в транзакции и не может участвовать в другой транзакции - PullRequest
0 голосов
/ 16 апреля 2020

при выполнении кода ниже с (потенциально) большим набором 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;
    }
}

...