【发布时间】:2015-12-11 15:36:33
【问题描述】:
我的 WebAPI 项目中有以下操作,它运行存储过程来更新(和其他一些操作)People 表:
public HttpResponseMessage SetAsMain(int id)
{
People people = repository.GetById(id);
if (people == null)
{
return ErrorMsg(HttpStatusCode.NotFound, string.Format("No people with ID = {1}", id));
}
if (people.IsMain)
{
return ReturnMsg(HttpStatusCode.OK, string.Format("{0} is already set as main", people.FullName));
}
try
{
var parameters = new Dictionary<string, string>();
parameters.Add("PeopleID", id.ToString());
repository.ExecProcedure("usp_PeopleSetMain", parameters);
return Request.CreateResponse(HttpStatusCode.OK, repository.GetById(id));
}
catch (Exception ex)
{
return ErrorMsg(HttpStatusCode.InternalServerError, ex.Message);
}
}
我在存储过程更新后检索数据时遇到问题。在这个地方:
return Request.CreateResponse(HttpStatusCode.OK, repository.GetById(id));
我得到了与更新前相同的数据。但是当我再次调用这个方法时,就会有一个实际的数据。
如何刷新存储库中的数据?
你能告诉我为什么repository.GetById(id) 在ExecProcedure 之后从不获取新数据吗?
如果我需要添加更多信息,请告诉我
更新
我的存储库中的方法 GetById:
public T GetById(object id)
{
return context.Set<T>().Find(id);
}
【问题讨论】:
-
Find如果实体已存在于上下文中,则立即返回该实体,而无需转到数据存储。您可以重置上下文或分离实体,然后再次执行Find,如果不知道您的存储库如何工作,很难说什么是最好的。 -
感谢@Crowcoder。我不知道
Find。如何分离实体? -
您可以将 Find 替换为 FirstOrDefault/SingleOrDefault 这将执行 SQL
-
@MegaTron ObjectContext 有一个 Detach 方法,但它可能更适合 ieaglle 的建议。
-
还有DbExtensions.AsNoTracking 方法很有用。
标签: c# .net asp.net-mvc entity-framework asp.net-web-api