Почему Entity Framework 4.0 требует использования DTM? Возможно ли это не использовать? - PullRequest
1 голос
/ 02 ноября 2010

Я пользуюсь EF почти год назад. Я просто пытаюсь использовать TransactionScope для решения довольно сложного запроса, подобного следующему коду.

using (var tran = new TransactionScope())
{
    // Clear all data in some table
    DataContext.SomeTables
        .ForEach(x => DataContext.SomeTables.DeleteObject(x));

    DataContext.SaveChanges();

    // Import data from excel as DataSet object.
    var ds = ImportDataFromExcel(file.FullName);

    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        DataContext.SomeTables.AddObject(new SomeTable
        {
            // fill object with data from current row.
        });
    }

    DataContext.SaveChanges();

    // Commit Transaction
    tran.Complete();
}

После этого я получил сообщение о том, что DTM не включен или недоступен. Я знаю, это потому, что эта служба на сервере базы данных не запускается или блокируется брандмауэром. Но это не моя точка зрения.

Я хочу знать, почему EF использует этот сервис для создания транзакции, в то время как обычный SQL-скрипт может использовать только некоторые операторы, такие как «BEGIN TRAN», «SAVE TRAN» или «ROLLBACK TRAN».

Есть ли другой способ избежать вызова службы DTM для моего довольно простого оператора транзакции?

PS. Текущая рабочая база данных настолько мала, и я думаю, что это не должно зависеть от другой техники транзакций.

Спасибо

1 Ответ

2 голосов
/ 02 ноября 2010

После поиска на многих веб-сайтах я обнаружил, что могу вручную создать транзакцию с использованием транзакции Entity, как показано в следующем исходном коде.

using (var tran = DataContext.BeginTransaction())
{
    // Clear all data in some table
    DataContext.SomeTables
        .ForEach(x => DataContext.SomeTables.DeleteObject(x));

    DataContext.SaveChanges();

    // Import data from excel as DataSet object.
    var ds = ImportDataFromExcel(file.FullName);

    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        DataContext.SomeTables.AddObject(new SomeTable
        {
            // fill object with data from current row.
        });
    }

    DataContext.SaveChanges();

    // Commit Transaction
    tran.Commit();
}

Класс помощника

public static DbTransaction BeginTransaction(this ObjectContext context, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
    if (context.Connection.State != ConnectionState.Open)
    {
        context.Connection.Open();
    }

    return context.Connection.BeginTransaction(isolationLevel);
}

Kim Major за ответ на следующий вопрос.Я не могу найти другие страницы, на которых четко предлагается использовать транзакцию Entity, включая основной веб-сайт MSDN ( Как: управлять транзакциями в Entity Framework ).

Как использовать транзакции сEntity Framework?

...