保存更改后回滚

3

我有一个控制器和一个存储库,使用EF 6。

控制器文件

int userID = _myrepository.addCustomer(model)

我获取userID

然后使用第三方插件进行支付(例如:)

var success = makePaymentThroughPaymentProcessor(userID);

现在,如果付款未成功或出现错误,我希望回滚更改,以便不会将任何客户添加到数据库中。
我已尝试使用包装存储库方法的方式来实现。
(var transaction = objMCOEntities.Database.BeginTransaction())
{
//code...
context.SaveChanges();
return userID;

我查看了 https://msdn.microsoft.com/zh-cn/data/dn456843.aspx,但我不确定在调用 addCustomer 存储库方法后如何引用事务。
我可以先收款,然后再将客户添加到数据库中,但如果在将客户添加到数据库时出现错误,则不会创建客户,但付款已经完成,那么我必须退款给客户。

为什么不直接添加客户,如果付款失败就将其删除? - Dr. Stitch
@Dr.Stitch 我认为那可能是最简单的方法,但我认为可能有更优雅的方式。 - Andre Escudero
我认为这将比任何东西都更有帮助。http://www.codeguru.com/csharp/.net/net_data/sortinganditerating/article.php/c10993/SystemTransactions-Implement-Your-Own-Resource-Manager.htm#page-2 - KhawajaAtteeq
除非您提交事务,否则您所做的更改将不会影响数据库。如果发生错误,所有更改都将被回滚。 - Karthikeyan
1个回答

1
如果您正在使用Entity Framework 6,可以查看this页面。基本上,您必须在tranaction.Commit()和transaction.Rollback()之间进行选择;但我认为在这种情况下这并不是必需的。如果您的代码中有正确的顺序(首先通过第三方工具付款,然后保存到数据库),则不一定需要事务,但我不知道这个第三方工具的具体情况。

是的,我正在使用EF 6,阅读页面,但我不确定在调用addCustomer存储库方法后如何引用事务。 - Andre Escudero
你能否将addCustomer方法放在事务中而不是存储库方法中? - hbulens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接