【发布时间】:2014-12-29 15:45:36
【问题描述】:
我正在使用 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 调用的更改?
【问题讨论】:
-
有几件事,如果 SaveChanges 成功了,为什么要回滚?您正在重新抛出异常,因此您永远不会将答案发送回调用者,不要重新抛出它
-
我认为您可以使用事务,请查看msdn.microsoft.com/en-us/data/dn456843.aspx。您可以在某些情况下使事务失败,这将回滚。
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
@dariogriffo 保存一些更改后,可能会有一些后检查条件,如果这些条件失败,我需要回滚之前所做的更改。问题是在前端检查的那些条件......以及关于投掷错误,我会理解你的观点。谢谢。 :)
-
@SurgeonofDeath 谢谢..您可以在我的控制器方法中看到,对于每个请求表单前端,我正在创建一个新的存储库实例来服务该请求..所以上下文实例不会相同所有请求...
标签: c# entity-framework asp.net-mvc-4 asp.net-web-api