我正在使用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调用的更改?
答案 0 :(得分:4)
简答:AFAIK,没有。一旦调用了saveChanges(),就会向您的数据库发出SQL语句,并且已提交数据库事务。回滚的唯一方法是实现自定义,而不是数据库事务或EF数据上下文。
答案很长:您的API中的每个请求都有不同的数据上下文(基于您在动作方法中新建上下文的上述代码),这是正确的。另外,请重新考虑将所有EF操作包装在存储库后面。以下是来自viewpoints的smart人describe,{{3}}如何使您的代码不必要地复杂化。
一个想法是" stage"您对表格进行更改/插入,然后再对其进行检查。如果检查通过,将更改移动到实际表中,否则从暂存表中删除它们。