如何在 WebAPI 中回滚已保存的更改

本文关键字:保存 WebAPI | 更新日期: 2023-09-27 18:35:31

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

如何在 WebAPI 中回滚已保存的更改

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

长答案:您是正确的,对 API 的每个请求都将具有不同的数据上下文(基于您在操作方法中新建上下文的上述代码)。 此外,请重新考虑将所有 EF 操作包装在存储库后面。 以下是聪明人的一些观点,描述了这如何不必要地使您的代码复杂化。

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