我正在使用linq到实体(C#Winforms),我的数据库具有以下结构:
所有的拳头,我在表'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插入。所以这里的问题是:如果其中一个插入失败,如何进行回滚?假设我已经在两个表中插入了记录,但是在第三个表中无法插入,我该如何删除所有更改?
答案 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;
}