Sql server 如何处理聚合根之间引用的并发性?

Sql server 如何处理聚合根之间引用的并发性?,sql-server,domain-driven-design,ef-core-2.1,Sql Server,Domain Driven Design,Ef Core 2.1,我有一个聚合根(Slave),其中引用了AG(Master),也就是说,我在DB中有一个外键约束 不太可能,但仍有可能在插入引用从之前删除引用的主。这可以避免使用可重复读取或可序列化事务隔离级别,但会对性能产生负面影响 在这种情况下,我更喜欢乐观并发检查:尝试可能会失败。但是,很难将抛出的dbUpdateException追溯到问题的语义 换句话说,拥有文本消息对于理解哪个引用实际失败不是一个非常方便的方法: 更新条目时出错。查看内部异常 详情请参阅 内部异常SqlException-“INSE

我有一个聚合根(
Slave
),其中引用了AG(
Master
),也就是说,我在DB中有一个外键约束

不太可能,但仍有可能在插入引用
之前删除引用的
。这可以避免使用
可重复读取
可序列化
事务隔离级别,但会对性能产生负面影响

在这种情况下,我更喜欢乐观并发检查:尝试可能会失败。但是,很难将抛出的
dbUpdateException
追溯到问题的语义

换句话说,拥有文本消息对于理解哪个引用实际失败不是一个非常方便的方法:

更新条目时出错。查看内部异常 详情请参阅

内部异常SqlException-“INSERT语句与冲突 外键约束“FK_Slaves_Masters_MasterId”。冲突 发生在数据库“EFExperiments”表“dbo.Masters”列中 “Id”。该语句已终止。“

我扫描了
SqlEception
,它看起来既不是索引名,也不是列名分别存在的表,而是消息。不过,将此错误解释为包含实体名称和类型的“ReferenceEntityNotFoundException”会非常好。这样就可以向用户显示友好的消息,解释发生了什么:

主机(id=123)不再存在。把奴隶分配给另一个奴隶

这里哪一种最好?是否可以使SQL server更加详细并返回表和列的名称,或者我必须解析消息?是否存在用于此目的的EF扩展库


另外,还有一个选项可以完全删除FK约束,并允许存在悬空从属设备,向用户显示它们具有非有效状态。但是这绝对是一种过度使用。

没有这样的库,但是代码中该位置出现的错误号547可能足以继续下去

此外,您还可以在邮件中搜索特定的FK名称。从错误消息中提取对象名称应该是可靠的,因为它们是源代码的一部分,不依赖于语言

例如:


没有这样的库,但代码中该位置出现的错误号547可能足以继续

此外,您还可以在邮件中搜索特定的FK名称。从错误消息中提取对象名称应该是可靠的,因为它们是源代码的一部分,不依赖于语言

例如:

catch (SqlException ex)
{
    foreach (SqlError e in ex.Errors)
    {
        if (e.Number == 547 && e.Message.Contains("FK_Slaves_Masters_MasterId") )
        {
            throw new ReferencedEntityNotFoundException("Master", "Slave", slave.MasterId);
        }
    }

    throw;    
}