C# 区分EF Core中的FK约束异常和其他db异常?

C# 区分EF Core中的FK约束异常和其他db异常?,c#,.net-core,entity-framework-core,asp.net-core-webapi,ef-core-3.1,C#,.net Core,Entity Framework Core,Asp.net Core Webapi,Ef Core 3.1,我有一个API(.NET Core Web API),其中包含许多在数据有效负载中需要外键ID的POST方法。如果这样的FK在数据库中不存在,我想抛出BadRequest 400状态,如果其他东西在数据库端不起作用,我想抛出500状态如何区分FK约束异常和其他db异常? 这个问题有一个陷阱。当我使用EF-Core时,我不想依赖特定的数据库提供者(在生产中,我使用Postgresql,在集成测试中,我使用内存SQLite) 这是我的解决方案,但我不确定它是否完美: 如果方法的数据负载需要FK约束I

我有一个API(
.NET Core Web API
),其中包含许多在数据有效负载中需要外键ID的
POST
方法。如果这样的FK在数据库中不存在,我想抛出BadRequest 400状态,如果其他东西在数据库端不起作用,我想抛出500状态如何区分FK约束异常和其他db异常?

这个问题有一个陷阱。当我使用
EF-Core
时,我不想依赖特定的数据库提供者(在生产中,我使用
Postgresql
,在集成测试中,我使用
内存SQLite

这是我的解决方案,但我不确定它是否完美: 如果方法的数据负载需要FK约束ID,那么在更新数据库之前,我基本上会检查数据库中是否存在这样的实体。如果不是,我抛出自定义异常,我在中间件中捕获该异常,因此如果FK Id无效,API响应总是相同的

正如你可能看到的,这是一个有点悲观的方法。我想知道是否有一种乐观的方法,所以信任DB,让它在DB中失败,但当它失败时,区分API客户端所犯的错误(如错误的ID),并返回400而不是500

谢谢你的帮助

编辑:

我只是想澄清一下。我不是说URL中有错误的FK ID。我说的是
POST
方法,例如,这个请求:

URL:
/api/items

数据(json):

{
“项目名称”:“Foo”,

“addressId”:999999我确信EF Core会通知您异常的性质(例如在您的案例中,FK违规)作为数据库操作失败时的内部异常?您可能无法获得所有请求。请求必须通过服务器防火墙,因此未经身份验证的错误URL或TL可能无法到达您的服务。您还将遇到与数据库的连接失败且您必须处理这些失败的情况。只有在he查询(命令文本)是坏的。@jdweng请看我的编辑。我不是说FKs错误的URL。URL很好,是关于请求中发送的数据。进行额外检查没有什么错,特别是在检查将提高性能的情况下。如果您遗漏ID,数据库将检查数据库的每一行,这可能需要几分钟。Y我们的id检查很快就会失败,这将节省大量时间。
{
    "itemName": "Foo",
    "addressId": 999999 <--- doesn't exists
}