代码之家  ›  专栏  ›  技术社区  ›  MyDaftQuestions

无法更新实体框架中的对象

  •  0
  • MyDaftQuestions  · 技术社区  · 6 年前

    我正在尝试通过我的asp.net mvc 5应用程序中的ef 6更新我的表。

    我没有收到错误消息或异常,但没有任何内容保存到数据库中。我怀疑那东西不是 IQueryable 如果我的理解是正确的,那么就不会被ef跟踪。

    public async Task Work(Plan newPlan)
    {
        var existingPlan = await this._planQuery.GetPlan(112);
    
        if (existingPlan != null)
        {
            await this._planCommand.UpdatePlan(newPlan, existingPlan))
        }
    }
    

    两种相关的方法是

    internal async Task<Plan> GetPlan(int id)
    {
        return await base.DataContext.Plans.SingleAsync(a => a.Id == id);
    }
    
    internal async Task<bool> UpdatePlan(Plan newPlan, Plan existingPlan)
    {
        existingPlan.LastEditDate = DateTime.Now;
        existingPlan.PlanName = newPlan.PlanName;
        existingPlan.Website = newlan.Website;
    
        if (!await base.SaveToDatabase())
            return false;
    
         return true;
    }
    

    这就是我要做的,如果我理解了我所期望的:

    1. 接收具有各种属性值的对象。这需要更新现有的数据库条目,当前硬编码为112(仅用于测试)

    2. 看看id为112的计划是否存在(确实存在)。我们来命名 existingPlan . 我希望EF能追踪这方面的最新进展

    3. 既然计划存在,打电话给 UpdatePlan ,提供 newPlan 以及 现有计划

    4. “映射”相关的新值 新计划 现有计划

    5. 因为ef应该跟踪现有的计划(现在已经更新了),所以只需保存

    我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   pfx    6 年前

    我注意到 Plan 实例通过 _planQuery 对象,而更新是通过 _planCommand 对象。
    也许这些不一样 DbContext 实例;如果是这样,则 计划 实例未在 数据库上下文 执行更新,因此不会执行更新语句。

    要解决此问题,请确保检索和更新都通过同一个 数据库上下文 实例。