C# 如何回滚WebAPI中保存的更改

C# 如何回滚WebAPI中保存的更改,c#,entity-framework,asp.net-mvc-4,asp.net-web-api,C#,Entity Framework,Asp.net Mvc 4,Asp.net Web Api,我正在使用WebAPI框架为我的前端HTML5应用程序提供后端服务。我使用实体框架进行对象关系映射。WebAPI通过HTTP公开了一组用于数据操作的方法,前端使用WebAPI进行数据操作、检索、插入、更新等 以下是我如何在Web API存储库中执行数据库操作: public class PersonRepository : IPersonRepository { private PersonDetailsContext personContext; public PersonR

我正在使用WebAPI框架为我的前端HTML5应用程序提供后端服务。我使用实体框架进行对象关系映射。WebAPI通过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调用的更改吗?

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

详细回答:您的API中的每个请求都有一个不同的数据上下文,这是正确的,基于您上面的代码,您在action方法中创建了一个上下文。另外,请重新考虑将所有EF操作包装到存储库中。以下是一些人的观点,他们认为这会不必要地使代码复杂化


一种方法是将更改/插入阶段化到一个表中,然后对该表运行检查。如果检查通过,请将更改移动到实际表中,否则将其从暂存表中删除。

有几件事,如果成功保存更改,为什么要回滚?您正在重新引发异常,因此您永远不会将答案发送回调用方,请不要重新引发。我认为您可以使用事务,请检查。在某些情况下,您可以使事务失败,这将回滚。我已编辑了您的标题。请看,如果一致意见是否定的,他们就不应该。@dariogriffo保存一些更改后,可能会有一些检查后条件,如果这些条件失败,我需要回滚以前所做的更改。问题是在前端检查了这些条件……关于抛出错误,我将接受您的观点。谢谢@SurgeonofDeath谢谢..您可以在我的控制器方法中看到,对于前端的每个请求,我正在创建一个新的存储库实例来服务该请求..因此,上下文实例对于所有请求都不会相同..感谢您在这方面的输入:分期付款似乎是解决这个问题的好办法。。