У меня есть старый ObjectContext и несколько новых DbContext в моем проекте (т.е. BoundedContext для разных целей). Некоторое время мне нужно зафиксировать изменения из нескольких из них в одной транзакции. В некоторых случаях мне нужно сохранить данные из ObjectContext и DbContext. В EF 5.0, чтобы избежать MSDC, я пишу обертку
public class ContextUnitOfWork
{
List<IContext> ContextList;
public ContextUnitOfWork()
{
ContextList = new List<IContext>();
}
public void RegisterContext(IContext Context)
{
ContextList.Add(Context);
}
public bool IsDisposed
{
get
{
return ContextList.Any(x => x.IsDisposed);
}
}
public bool HasChangedEntities
{
get
{
return ContextList.Any(x => x.HasChangedEntities);
}
}
public void Commit()
{
bool HasDbContext = ContextList.OfType<System.Data.Entity.DbContext>().Any();
try
{
if (HasDbContext)
{
ContextList.ForEach(x =>
{
if (x is System.Data.Entity.DbContext)
{
(x as System.Data.Entity.DbContext).Database.Connection.Open();
}
else if (x is System.Data.Objects.ObjectContext)
{
((System.Data.Objects.ObjectContext)x).Connection.Open();
}
});
}
using (var scope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required,
new System.Transactions.TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
ContextList.ForEach(x => x.Commit());
scope.Complete();
}
}
catch (System.Data.UpdateException uex)
{
var ErrorList = uex.StateEntries.Select(x => x.Entity).ToList();
}
finally
{
if (HasDbContext)
{
ContextList.ForEach(x =>
{
if (x is System.Data.Entity.DbContext)
{
(x as System.Data.Entity.DbContext).Database.Connection.Close();
}
else if (x is System.Data.Objects.ObjectContext)
{
((System.Data.Objects.ObjectContext)x).Connection.Close();
}
});
};
}
}
}
Но в EntityFramework 6.0.1 это не работает. ObjectContext успешно фиксируется, но когда DbContext вызывает SaveChanges(), возникает исключение типа EntityException с текстом "Базовый поставщик не прошел EnlistTransaction". И Inner Expection содержит {"Сетевой доступ для диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для сетевого доступа в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов."}
Любая идея зафиксировать контексты в одной транзакции и избежать исключения MDTC?