2016-08-26 45 views
1

我一直在使用实体框架6,试图通过EF处理一些常见问题,如主/外键/唯一键约束。 EF给出了SqlException作为InnerException,似乎 - 就我发现到现在为止 - 理解实际问题的唯一方法是在该对象中使用错误代码?SqlExceptions的抽象(使用实体框架)

我想抽象这些例外通过捕获EF异常,并通过在InnerException分析错误代码抛出自己的异常。我在这一点上有一些考虑。

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

  2. 而不是SQL Server有可能使用其他SQL服务器,如 MySQL和我试图抽象这些 异常的另一个原因。

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

我读this博客文章,不幸的是有问题的情况下,是我第一次去的方式。我希望尽可能不使用任何第三方库(当然,这样做并不重要)。我想知道是否有测试和接受的方式做到这一点,否则我愿意接受任何建议。

+0

但是,不应该像你的代码那样约束一个问题,你应该修复?所以你不想去捕捉那些例外 - 只是让他们扔掉? –

+0

不,我想尽可能恢复(例如,客户想要添加数据库中存在的用户)。但是,EF异常不会像错误代码那样告诉细节。我想解释这些错误代码并抛出我自己的异常而不是EF。这是否明确? – Deniz

+0

是的,我看到你在说什么,但你需要确保你没有掩盖和错误,你真的希望应用程序崩溃从 –

回答

1

SQL Server的代码由服务器版本不改?

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

我认为可以添加处理几个众所周知的情况。但是您必须考虑到您不知道广告开发时间的通用异常,并处理这些异常。

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

最后,抬起头:我见过的民间尝试之前做类似的,混合的结果。好处并不完全是压倒性的,所付出的努力是相当可观的。

+0

我们有数据库的控制,所以在那一点上,我们很幸运。我了解您对错误代码的担忧,我认为您是对的。希望我没有处理大量不同的错误情况,除了其中一些我可以创建/抛出一个通用异常。我试图平衡好处和努力,以继续适合的东西。 – Deniz