Я хочу вставить запись в существующую таблицу, используя контекст, и создать новые таблицы в той же транзакции, используя другой контекст. Два контекста используют одно и то же соединение, однако, когда я хочу выполнить функцию 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);