Понимание транзакций в Entity Framework - PullRequest
8 голосов
/ 26 ноября 2011

Привет. Я пытаюсь использовать транзакции вместе с Entity Framework. Имея в Интернете так много информации о различных способах осуществления транзакций, я должен сказать, что я немного запутался в правильном пути. У меня есть пример базы данных с двумя таблицами Employee и Company. Таблица Employee имеет внешний ключ, относящийся к идентификатору компании. Учитывая, что я хочу реализовать транзакцию, в которой я вставляю запись в таблицу Company, а затем запись в таблицу Employee, и я хочу сделать это так, чтобы записи вставлялись, только если оба успешны, у меня есть следующий код.

public void addCompanyToDatabase()
    {
        using (var context = new myTestEntities())
        {
            context.Connection.Open(); //added this as was getting the underlying   
            //provider failed to open
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    Company c = new Company();
                    c.Name = "xyz";
                    context.Companies.AddObject(c);
                    context.SaveChanges();

                    //int a = 0;
                    //int b = 5 / a;

                    Employee e = new Employee();
                    e.Age = 15;
                    e.Name = "James";
                    e.CompanyId = c.Id;
                    context.Employees.AddObject(e);
                    context.SaveChanges();

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception Occurred");
                }
            }
        }
    }

Я хотел знать, был ли это правильный способ осуществления транзакций. Если это так, то зачем использовать функции SaveChanges(false) и scope.AcceptAllChanges(). Любая информация будет полезна.

Ответы [ 2 ]

14 голосов
/ 26 ноября 2011

В вашем случае вам не нужно управлять каким-либо соединением или транзакцией: Entity Framework сделает это за вас. Если вы не предоставите EF открытое соединение (но со строкой соединения), оно откроет соединение и начнет транзакцию во время вызова context.SaveChanges(). Если во время этого вызова что-то не получится, транзакция будет отменена.

Другими словами, ваш метод может выглядеть просто так:

public void addCompanyToDatabase()
{
    using (var context = new myTestEntities())
    {
        Company c = new Company();
        c.Name = "xyz";
        context.Companies.AddObject(c);

        Employee e = new Employee();
        e.Age = 15;
        e.Name = "James";
        e.CompanyId = c.Id;
        context.Employees.AddObject(e);

        // Only call SaveChanges last.
        context.SaveChanges();
    }
}
0 голосов
/ 26 ноября 2011

1-this service (я думаю, что служба транзакций) должна быть run в клиенте для поддержки TransactionScope

2-Usefull, когда у вас есть tow илибольше баз данных в вашем приложении, и вы хотите, чтобы все базы данных обновляли транзакции (такие как изменение строки соединения вашего контекста).

3 - Когда у вас есть база данных, лучше использовать SaveChanges (), которая внутренне реализует транзакцию.

...