Соединение уже в транзакции - Ошибка в CreateTables EF Core - PullRequest
0 голосов
/ 17 июня 2019

Я хочу вставить запись в существующую таблицу, используя контекст, и создать новые таблицы в той же транзакции, используя другой контекст. Два контекста используют одно и то же соединение, однако, когда я хочу выполнить функцию CreateTables, я получаю следующую ошибку:

Соединение уже находится в транзакции и не может участвовать в другой транзакции.

В чем причина этого, есть ли где-то несколько скрытых транзакций? Как я могу выполнить эти два изменения в одной транзакции?

Транзакция:

using (var newTablesContext = new NewTablesContext(options, schema))
{
  using (var transaction = existingContext.Database.BeginTransaction())
  {
    try
    {
      newTablesContext.Database.UseTransaction(transaction.GetDbTransaction());
      RelationalDatabaseCreator databaseCreator =
        (RelationalDatabaseCreator)newTablesContext.Database.GetService<IDatabaseCreator>();
      databaseCreator.CreateTables();

      existingContext.Entities.Add(entity);
      if (existingContext.SaveChanges() < 1)
      {
        throw new Exception();
      }

      transaction.Commit();
    }
    catch (Exception e)
    {
      transaction.Rollback();
      return null;
    }
  }
}

Startup.cs:

private Action<IServiceProvider, DbContextOptionsBuilder> SqlServerConfigurator(IServiceCollection services)
{
  var connectionString = Configuration.GetConnectionString("dbConnection");
  services.AddScoped(s => new SqlConnection(connectionString));

  return (locator, builder) =>
  {
    var connection = locator.GetRequiredService<SqlConnection>();

    builder.UseSqlServer(connection)
      .ReplaceService<IModelCacheKeyFactory, DbSchemaAwareModelCacheKeyFactory>();
  };
}

Внутри ConfigureServices:

var configSqlServer = SqlServerConfigurator(services);

services.AddDbContext<ExistingContext>(configSqlServer);

1 Ответ

0 голосов
/ 17 июня 2019

Вам не нужно использовать эту строку

newTablesContext.Database.UseTransaction(transaction.GetDbTransaction());

Ниже приведен мой код с использованием асинхронной транзакции. Вы можете просмотреть в качестве ссылки. Пожалуйста, дайте мне знать, если вам нужна помощь.

using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    try
    {
        var commentToUpdate = await _unitOfWork.Repository<Comment>().Query().Where(cm => cm.Id == commentId).SingleOrDefaultAsync();
        commentToUpdate.CommentStatus = commentStatus;
        await _unitOfWork.Repository<Comment>().UpdateAsync(commentToUpdate);
        transaction.Complete();
        return true;
    }
    catch (Exception)
    {
        _unitOfWork.Rollback();
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...