[asp.net-mvc]在运行存储过程后刷新存储库

发布时间: 2017/3/25 11:04:16
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

有以下几个在我运行存储的过程来更新的 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);
}

解决方法 1:

碰巧的是因为实体框架上下文中已经包含您的对象。方法 Find(id) 总是检查是否存在于上下文中的对象,如果它的存在,实体框架将不会查询数据库。存储的过程不会更改上下文对象因为他们执行直接对数据库,这就是为什么你不你的实体中看到更新后的值。

你可以变通办法这与 1 以下事情︰

  1. 停止跟踪在上下文中的实体
  2. 使用 AsNoTracking() 到无需以下跟踪查询实体。
  3. 查询对象使用 First(...)FirstOrDefault(...)Single(...) 等后执行存储的过程。

我会推荐你去使用选项 1 或 2。选项 1:

context.Entry(people).State = EntityState.Detached;

如果您运行较早版本的实体框架,则应分离对象︰

context.People.Detach(people);

(感谢 ieaglle)您也可以查询您的实体关闭马上跟踪 (选项 2):

context.People.AsNoTracking().FirstOrDefault(p => p.Id == id);
官方微信
官方QQ群
31647020