如何在 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 调用的更改吗?
简短回答:AFAIK,不。 调用 saveChanges() 后,SQL 语句已发送到数据库,并且数据库事务已提交。 回滚的唯一方法是实现自定义内容,而不是数据库事务或 EF 数据上下文。
长答案:您是正确的,对 API 的每个请求都将具有不同的数据上下文(基于您在操作方法中新建上下文的上述代码)。 此外,请重新考虑将所有 EF 操作包装在存储库后面。 以下是聪明人的一些观点,描述了这如何不必要地使您的代码复杂化。
一个想法是将更改/插入"暂存"到表,然后对其运行检查。 如果检查通过,请将更改移动到实际表中,否则将其从暂存表中删除。