建议的数据库回滚方法

时间:2011-10-12 01:54:08

标签: c# linq entity-framework rollback

我正在使用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;

使用表'creditos'获得的PK,我使用类似的方法在其他表中将其作为FK插入。所以这里的问题是:如果其中一个插入失败,如何进行回滚?假设我已经在两个表中插入了记录,但是在第三个表中无法插入,我该如何删除所有更改?

2 个答案:

答案 0 :(得分:2)

您可以将所有数据库操作包装在事务中。如果发生任何事情,您只是不提交事务,一切都将被回滚。实体框架数据库操作将参与事务,并且在您调用事务的提交方法之前不会提交。

或者,如果您正确地映射了实体,那么您可以在代码中指定关系,框架将为您解析外键。这意味着你可以写

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

框架理解这些对象关系映射到数据库关系,涉及映射的外键。将首先插入依赖项(在您的情况下,creditos表),然后将检索标识值,然后使用该关系更新相关表。

您可以通过一次SaveChanges电话完成所有操作。

答案 1 :(得分:1)

为了实现事务范围功能,我相信你想要的是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;
    }