【问题标题】:Update entity framework entity with multiple relationships to other entities更新与其他实体具有多重关系的实体框架实体
【发布时间】:2019-08-06 11:52:45
【问题描述】:

我正在使用带有实体框架核心的 web api。我有一个与 Company(通过 CompanyId)、Status(通过 StatusId)和 Position(通过 PositionId)有关系的 Worker 实体。通过 API 使用请求,我希望能够更新工作人员。

我只想传递 WorkerId 和 PositionId 的请求。在数据层中,我检查请求中是否存在 PositiionId,如果不存在则返回控制器并返回未找到位置的消息。下面是一个没有公司和状态检查的代码示例。

Public void Update(WorkerEntity worker)
{
    var workerRecord = _context.WorkerEntity.SingleOrDefault(w => w.Id == worker.Id);

    if (workerRecord == null)
    {
         Log.Logger("Cannot find the worker with Id " + worker.Id);
         return;
    }

    var positionRecord = _context.PositionEntity.SingleOrDefault(w => w.Id == worker.PositionId);

    if (positionRecord == null)
    {
         Log.Logger("Cannot find the position with Id " + worker.PositionId);
         return;
    }

    workerRecord.Position = positionRecord;
    _context.SaveChanges();
}

我还尝试了一种简单的方法,使用 .Single 如果记录确实存在则捕获错误,但捕获仅输出通用的“序列不包含元素”,这对了解没有帮助实体失败。

有没有更简单的方法来检查用户在请求中添加的关系 ID 不是伪造的,没有行和代码检查 Id 是否存在?这个表可能有 3 个关系,但我有另一个表有 5 个,如果为空检查,则有 5 个。

【问题讨论】:

  • 您的 ef 连接字符串是否指向正确的数据库?当您使用Single 时,根据您的查询,数据库中必须有一条记录。如果没有,则抛出Sequence contains no elements,这是正确的行为。
  • 实体框架和上下文都设置正确。我想知道这个解决方案是否有更简洁的方法。 single 的问题是,如果用户在请求中输入了虚假的 Id,那么如果我使用 Single,则无法知道哪个 Id 引发了错误。
  • 你这样做的方式是正确的。用户SingleOrDefault 并检查是否为空。
  • 嗯,您必须对照特定的数据库表检查每个 Id。我没有看到任何简写。使用Any 代替SingleOrDefault 可以使检查更轻松。
  • 如果您只想知道您的查询是否有任何记录,您可以使用Any,它将返回 bool。

标签: c# entity-framework-core asp.net-web-api2


【解决方案1】:

要获得有意义的消息,您必须手动检查每个字段。可以使用 Any() 方法稍微简化一下。

if (!context.PositionEntity.Any(w => w.Id == worker.PositionId)
{
    Log.Logger("Cannot find the position with Id " + worker.PositionId);
    return;
}

您将无法从 EF 异常中获得描述性错误消息。

但你真的想这样做吗?我假设您将这些查找值(位置、状态等)作为前端的下拉列表,您可以在其中使用数据库中的值加载它们。因此,在正常情况下,无法选择不正确的值并将其发送到 API。但是不知何故,如果确实如此,您就会遇到 EF 核心默认错误,以避免搞砸事情。

干杯,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2011-03-06
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多