Предлагаемый способ отката в базе данных - PullRequest
0 голосов
/ 12 октября 2011

Я использую linq для сущностей (C # Winforms), и моя база данных имеет следующую структуру: enter image description here

Прежде всего, я вставляю новую запись в таблицу «creditos», поскольку все таблицы должны знать PK этой таблицы. Я использую метод с чем-то вроде этого

Credito cred = new Credito();
cred.Producto = credito.producto;
cred.Cantidad = credito.monto_prestamo;
cred.TasaInteres = credito.tasa_interes;

, а затем

context.creditos.AddObject(cred);
context.SaveChanges();
//Get the ID of the inserted record
credito.idCredito = cred.IDCredito;

Получив PK таблицы 'creditos', я вставляю ее как FK в другие таблицы, используя аналогичные методы. Итак, вопрос здесь: как сделать откат, если одна из вставок не удалась? Предположим, что я уже вставил записи в две таблицы, но не удается вставить в третью, как мне удалить все изменения?

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Вы можете обернуть все свои операции с базой данных в транзакцию.Если что-то «происходит», вы просто не фиксируете транзакцию, и все будет откатано.Операции базы данных Entity Framework будут участвовать в транзакции и не будут зафиксированы до тех пор, пока вы не вызовете метод фиксации транзакции.

В качестве альтернативы, если у вас правильно сопоставлены сущности, вы можете указать отношения в коде, и каркас разрешитвнешние ключи для вас.Это означает, что вы можете написать

cred.Persons.Add(person);
cred.Addresses.Add(address);

. Фреймворк понимает, что эти объектные отношения сопоставляются с отношениями базы данных, которые включают сопоставленные внешние ключи.Сначала будет вставлена ​​зависимость (в вашем случае таблица creditos), затем будет получено значение идентификатора, а затем соответствующие таблицы будут обновлены с использованием этого отношения.

Вы можете сделать все это водиночный SaveChanges звонок.

1 голос
/ 12 октября 2011

Чтобы достичь функциональности области транзакции, я считаю, что вам нужен TransactionScope.Он поставляется с несколькими оговорками http://simpleverse.wordpress.com/2008/08/05/using-transactionscope-for-handling-transactions/

try
    {
        using (System.Transactions.TransactionScope scop = new System.Transactions.TransactionScope())
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                foreach (Order order in orders)
                {
                    entity.AddToOrders(order);
                }
                entity.SaveChanges();
            }
            scop.Complete();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
...