如何回滚保存Web API中的更改

时间:2014-12-29 15:45:36

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

我正在使用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调用的更改?

1 个答案:

答案 0 :(得分:4)

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

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

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