C# 数据库回滚的建议方法

C# 数据库回滚的建议方法,c#,linq,entity-framework,rollback,C#,Linq,Entity Framework,Rollback,我正在使用linq到实体(C#Winforms),我的数据库具有以下结构: 首先,我在“creditos”表中插入新记录,因为所有表都需要知道这个表的主键。我使用这样的方法 Credito cred = new Credito(); cred.Producto = credito.producto; cred.Cantidad = credito.monto_prestamo; cred.TasaInteres = credito.tasa_interes; 然后 context.credi

我正在使用linq到实体(C#Winforms),我的数据库具有以下结构:

首先,我在“creditos”表中插入新记录,因为所有表都需要知道这个表的主键。我使用这样的方法

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插入其他表中。所以这里的问题是:如果其中一个插入失败,我如何进行回滚?假设我已经在两个表中插入了记录,但在第三个表中插入失败,如何删除所有更改?

要实现事务范围功能,我相信您需要的是TransactionScope。它附带了一些警告


要实现事务范围功能,我相信您需要的是TransactionScope。它附带了一些警告


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

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

cred.Persons.Add(person);
cred.Addresses.Add(address);
框架理解这些对象关系映射到数据库关系,其中涉及映射的外键。将首先插入依赖项(在您的示例中为
creditos
表),然后检索标识值,然后使用该关系更新相关表


您可以在一个
SaveChanges
调用中完成这一切。

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

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

cred.Persons.Add(person);
cred.Addresses.Add(address);
框架理解这些对象关系映射到数据库关系,其中涉及映射的外键。将首先插入依赖项(在您的示例中为
creditos
表),然后检索标识值,然后使用该关系更新相关表


您可以在一个
SaveChanges
呼叫中完成这一切。

谢谢Jeremy我感谢您的帮助谢谢Jeremy我感谢您的帮助如果所有实体都正确映射(如您所解释的),我会呼叫单个SaveChanges,但一些插入失败,SaveChanges方法会处理回滚操作吗?默认情况下,它将创建一个事务,这意味着它将在失败时回滚。进一步检查这个问题:如果所有实体都正确映射(如您所解释的),并且我调用了单个SaveChanges,但某些插入失败,SaveChanges方法是否会处理回滚操作?默认情况下,它将创建一个事务,这意味着它将在失败时回滚。检查此问题以了解更多信息: