【问题标题】:How to rollback saved changes in WebAPI如何回滚 WebAPI 中保存的更改
【发布时间】:2014-12-29 15:45:36
【问题描述】:

我正在使用 Web API 框架为我的前端 HTML5 应用程序提供后端服务。我使用实体框架进行对象关系映射。 Web API 通过 HTTP 公开一组方法用于数据操作,前端使用 WebAPI 进行数据操作(检索、插入、更新等)。

以下是我如何在 Web API 存储库中执行数据库操作:

public class PersonRepository : IPersonRepository
{
    private PersonDetailsContext personContext;

    public PersonRepository(PersonDetailsContext personContext)
    {
        this.personContext= personContext;
    }

public sResponse DeleteAccImage(ACCTIMAGE medAccImg)
    {
        sResponse sRes = new sResponse();
        sRes.IsSuccess = false;

        try
        {
            MEDACCTIMAGE medAccImgDelete = personContext.ACCTIMAGE.Where(X => X.ACCOUNT == medAccImg.ACCOUNT && X.CODE == medAccImg.CODE).SingleOrDefault();

            if (medAccImgDelete == null)
            {
                sRes.outMessage = "Image does not exist for Account = " + medAccImg.ACCOUNT;
                return sRes;
            }

            personContext.ACCTIMAGE.Remove(medAccImgDelete);
            personContext.SaveChanges();

            sRes.IsSuccess = true;
        }
        catch (System.Data.EntityException ex)
        {
            sRes.outMessage = ex.Message;
            throw;
        }
        catch (Exception ex)
        {
            sRes.outMessage = ex.Message;
            throw;
        }

        return sRes;
    }
}

这是将前端请求映射到上述存储库方法的控制器:

    [ActionName("PostDeleteAccImage")]
    [APIAuthentication]
    public sResponse PostDeleteAccImage(ACCTIMAGE accImg)
    {   
        //here i'm getting database name dynamically to connect to a database specified from front end
        IPersonRepository personRep = new personRepository(new PersonDetailsContext(PersonRepository.GetDBConnectionString(accImg.DataBaseName)));
        sResponse sResult = personRep.DeleteAccImage(medAccImg);
        return sResult;
    }

这是我的问题:

在调用SaveChanges() 之后,是否可以使用另一个 Web API 方法调用回滚在一个 Web API 调用中所做的更改?

我不确定这是否可能,因为我猜对于每个 API 请求,上下文不会相同(即,将创建 API 的新实例,因此它不会知道以前的上下文,对吗?)。

有没有办法回滚以前的 API 调用的更改?

【问题讨论】:

  • 有几件事,如果 SaveChanges 成功了,为什么要回滚?您正在重新抛出异常,因此您永远不会将答案发送回调用者,不要重新抛出它
  • 我认为您可以使用事务,请查看msdn.microsoft.com/en-us/data/dn456843.aspx。您可以在某些情况下使事务失败,这将回滚。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @dariogriffo 保存一些更改后,可能会有一些后检查条件,如果这些条件失败,我需要回滚之前所做的更改。问题是在前端检查的那些条件......以及关于投掷错误,我会理解你的观点。谢谢。 :)
  • @SurgeonofDeath 谢谢..您可以在我的控制器方法中看到,对于每个请求表单前端,我正在创建一个新的存储库实例来服务该请求..所以上下文实例不会相同所有请求...

标签: c# entity-framework asp.net-mvc-4 asp.net-web-api


【解决方案1】:

简短回答:AFAIK,不。一旦你调用了 saveChanges(),SQL 语句就会发送到你的数据库并且数据库事务已经提交。回滚的唯一方法是您实现的自定义内容,而不是数据库事务或 EF 数据上下文。

长答案:您是正确的,您的 API 中的每个请求都将具有不同的数据上下文(基于您在操作方法中新建上下文的上述代码)。另外,请重新考虑将所有 EF 操作包装在存储库后面。这里有一些来自smartviewpointsdescribe 这会使您的代码不必要地复杂化。

一个想法是将您的更改/插入“暂存”到一个表中,然后对它进行检查。如果检查通过,则将更改移动到实际表中,否则将其从暂存表中删除。

【讨论】:

  • 感谢您对此的投入。 :) staging 似乎是解决这个问题的好主意..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2016-08-07
  • 2012-08-28
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多