抽象SqlExceptions(使用实体框架)

时间:2016-08-26 09:11:43

标签: c# sql-server entity-framework

我一直在使用Entity Framework 6并尝试通过EF处理一些常见问题,例如主要/外部/唯一键约束。 EF将SqlException作为InnerException,似乎 - 就我现在发现的而言 - 理解实际问题的唯一方法是在SqlException对象中使用错误代码?

我想通过分析InnerException中的错误代码来捕获EF异常并抛出我自己的异常来抽象这些异常。那时我有一些考虑因素。

  1. SQL Server代码是否按服务器版本更改?我应该处理 不同版本的SQL Server以不同的方式,如为2008年,2012年等创建不同的实现?

  2. 可以使用其他SQL Server,而不是SQL Server     MySQL及其我试图抽象这些的另一个原因     异常。

  3. 例如,正如在that问题的接受答案中,我想捕获特定的错误,但我不想重新抛出,而是想抛出自己的异常。如果我不想做一些特别的事情,或者我没有任何特殊的例外,我可以创建并使用更通用的异常,我可以将原始异常存储到通用异常InnerException字段中。

    我阅读了this博文,不幸的是,有问题的案例是我的第一个出路。我想尽可能不使用任何第三方库(当然这对正确的做法并不重要)。我想知道是否有经过测试和接受的方式,否则我愿意接受任何建议。

1 个答案:

答案 0 :(得分:1)

  

SQL Server代码是否按服务器版本更改?

一旦发布,异常号码就无法更改。死锁是并且将保持1205,唯一索引重复键将保持2601,唯一约束违规将保持2627等等。但是,你看,在我选择的例子中,我向你展示了依赖于这些的危险:决定2601和2627之间的区别是什么?您友好的DBA可以决定它应该删除一个唯一索引,而是添加一个唯一约束(由索引强制执行,但这是无关紧要的),并且您的应用突然发现新错误。通过对异常进行深入检查,您可以在应用程序代码和SQL存储之间添加耦合,并且当存储修改本来是完全透明的更改(例如添加索引)时,可能会破坏应用程序。警告。

我认为为几个众所周知的案例添加处理是可行的。但是,您必须允许通知异常而不了解广告开发时间,并处理这些异常。

对于跨平台,您必须为每个平台进行自定义。好消息是“主键违规”在SQL Server和MySQL上是相同的概念,因此您可以将它转换为PrimaryKeyViolationException两个提供商。不是微不足道的,但它是可能的。

最后,一个抬头:我看到过民众试图做类似的事情,混合结果。好处并不是很大,而且所付出的努力是相当大的。