C# 如何回滚WebAPI中保存的更改
我正在使用WebAPI框架为我的前端HTML5应用程序提供后端服务。我使用实体框架进行对象关系映射。WebAPI通过HTTP公开了一组用于数据操作的方法,前端使用WebAPI进行数据操作、检索、插入、更新等 以下是我如何在Web API存储库中执行数据库操作: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
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谢谢..您可以在我的控制器方法中看到,对于前端的每个请求,我正在创建一个新的存储库实例来服务该请求..因此,上下文实例对于所有请求都不会相同..感谢您在这方面的输入:分期付款似乎是解决这个问题的好办法。。