【发布时间】: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