【问题标题】:Editing a record by accessing it通过访问来编辑记录
【发布时间】:2020-04-11 02:05:55
【问题描述】:

我正在更新数据库寄存器,但在更新之前我获取了相同的寄存器。

因此我收到以下错误:

无法跟踪实体类型“位置”的实例,因为 {'Id'} 具有相同键值的另一个实例已经存在 跟踪。附加现有实体时,确保只有一个实体 附加了具有给定键值的实例。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 查看 键值冲突。

这是代码:


            [FunctionName(nameof(PostUpdatePosition))]
            public ActionResult PostUpdatePosition([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "postUpdatePosition")]HttpRequestMessage request)
            {
                PositionViewModel viewModel;

                try
                {
                    // Received json 
                    viewModel = JsonConvert.DeserializeObject(request
                                    .Content
                                    .ReadAsStringAsync()
                                    .Result);

                    var clientId = positonRepository.GetById(viewModel.Id).ClientId;

                    // here the error appears. ▼
                    positonRepository.Update(new Domain.Entities.Position
                    {
                        Id = viewModel.Id,
                        Description = viewModel.Description,
                        Active = viewModel.Active,
                        ClientId = clientId
                    });

                    positonRepository.SaveChanges();
                }
                catch (Exception ex)
                {
                    return StatusCode(StatusCodes.Status500InternalServerError,
                        new EasyEpiJson()
                        .GetInternalServerError(ex));
                }

                return Ok(new EasyEpiJson().GetOK(viewModel));
            }
        }

我该如何解决这个问题?

【问题讨论】:

  • 您在这里制造自己的问题。只需摆脱 positionRepository 并直接在您的控制器中使用您的 DbContext 子类型。

标签: entity-framework linq azure-functions


【解决方案1】:

您正在尝试更新尚未被 EF 跟踪的位置。相反,首先检索您要更新的对象,更新字段并通过将该对象传递到您的存储库来完成:

            var position = positonRepository.GetById(viewModel.Id);

            position.Description = viewModel.Description;
            position.Active = viewModel.Active;

            positonRepository.Update(position);
            positonRepository.SaveChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多