我一直在使用Entity Framework 6并尝试通过EF处理一些常见问题,例如主要/外部/唯一键约束。 EF将SqlException
作为InnerException
,似乎 - 就我现在发现的而言 - 理解实际问题的唯一方法是在SqlException
对象中使用错误代码?
我想通过分析InnerException
中的错误代码来捕获EF异常并抛出我自己的异常来抽象这些异常。那时我有一些考虑因素。
SQL Server代码是否按服务器版本更改?我应该处理 不同版本的SQL Server以不同的方式,如为2008年,2012年等创建不同的实现?
可以使用其他SQL Server,而不是SQL Server MySQL及其我试图抽象这些的另一个原因 异常。
例如,正如在that问题的接受答案中,我想捕获特定的错误,但我不想重新抛出,而是想抛出自己的异常。如果我不想做一些特别的事情,或者我没有任何特殊的例外,我可以创建并使用更通用的异常,我可以将原始异常存储到通用异常InnerException
字段中。
我阅读了this博文,不幸的是,有问题的案例是我的第一个出路。我想尽可能不使用任何第三方库(当然这对正确的做法并不重要)。我想知道是否有经过测试和接受的方式,否则我愿意接受任何建议。
答案 0 :(得分:1)
SQL Server代码是否按服务器版本更改?
一旦发布,异常号码就无法更改。死锁是并且将保持1205,唯一索引重复键将保持2601,唯一约束违规将保持2627等等。但是,你看,在我选择的例子中,我向你展示了依赖于这些的危险:决定2601和2627之间的区别是什么?您友好的DBA可以决定它应该删除一个唯一索引,而是添加一个唯一约束(由索引强制执行,但这是无关紧要的),并且您的应用突然发现新错误。通过对异常进行深入检查,您可以在应用程序代码和SQL存储之间添加耦合,并且当存储修改本来是完全透明的更改(例如添加索引)时,可能会破坏应用程序。警告。
我认为为几个众所周知的案例添加处理是可行的。但是,您必须允许通知异常而不了解广告开发时间,并处理这些异常。
对于跨平台,您必须为每个平台进行自定义。好消息是“主键违规”在SQL Server和MySQL上是相同的概念,因此您可以将它转换为PrimaryKeyViolationException
两个提供商。不是微不足道的,但它是可能的。
最后,一个抬头:我看到过民众试图做类似的事情,混合结果。好处并不是很大,而且所付出的努力是相当大的。