У меня есть приложение, которое считывает данные из одной базы данных и преобразует эти данные в новую форму и записывает их в новую базу данных. Некоторые из таблиц в новой базе данных сделаны из нескольких таблиц в старой базе данных, поэтому происходит большое количество чтения и записи. Вот основная концепция системы:Entity Framework, Multi Threading и транзакции
public void TransferData()
{
OldEntities oldContext = new OldEntities()
NewEntities newContext = new NewEntities()
using(var transaction = newContext.Database.BeginTransaction())
{
try{
TransferTable(oldContext, newContext);
} catch (Exception e) {
transaction.Rollback();
}
}
}
public void TransferTable(OldEntities oldContext, NewEntities newContext)
{
List<Entity1> mainTable = oldContext.Where();
Parallel.ForEach(mainTable, (row) =>
{
using(NewEntities anotherNewContext = new NewContext())
{
anotherNewContext.Database.UseTransaction(newContext.Database.CurrentTransaction.UnderlyingTransaction);
// Do Work
}
});
}
Это приводит к тому, за исключением следующего:
Сделка прошла в не связан с текущим соединением. Могут использоваться только транзакции, связанные с текущим соединением.
Как я могу обойти это. Транзакция всегда будет поступать из другого контекста EF, но мне нужно, чтобы все они использовали одну и ту же транзакцию. Я не мог найти способ создать новый контекст как «ребенок» оригинала, и я стараюсь избежать создания транзакции, полностью отделенной от контекста EF. Какие-либо предложения?
«Я пытаюсь избежать создания транзакции, полностью отделенной от контекста EF» - Почему? – user469104
@ user469104 Наверное, в основном из наивности. Я, по общему признанию, слаб с транзакциями, и это добавлено, потому что я не мог позволить частичные нагрузки. Я предполагаю, что для создания транзакции вне контекста EF потребуется некоторая специальная обработка. Если я ошибаюсь в этом, тогда, пожалуйста, дайте мне знать. –