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;
}