实体框架 - 更新例外

时间:2011-04-20 19:16:39

标签: entity-framework sql-server-2008 entity-framework-4

我刚注意到,当使用Entity Framework更新数据时发生SqlException时,对SaveChanges的所有后续调用都将失败,因为导致异常的实体仍在“队列”中保存。

这只会刺激我们使用实时系统,因为许多用户无法保存他们的数据,因为更新失败,错误为“string or binary data would be truncated”。我们不得不求助于回收应用程序池。

如何删除/重置有问题的对象并让其他更新通过?

编辑:更好的是,在插入/更新期间处理Sql Exeptions的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

EF的第一个基本规则 - ObjectContext是工作单元,因此你必须以这种方式处理它。如果您在用户之间共享上下文,那么您犯了如此大的错误,以至于您应立即关闭应用程序,除非您进行修复,否则不要让用户使用它。我wrote the answer我描述了上下文正在实现的两种模式 - 工作单元和身份映射。如果您在并发用户之间共享上下文,则会使每个操作的结果不确定。你不能说用户是否有新的/提交的数据,你不能说你是否在一次交易中保存了用户正在修改的所有内容。

现在上下文在内部使用事务。每个SaveChanges保存事务中的每个修改记录(如果您共享上下文,则来自所有并发用户)。回滚单个错误和整个事务。一旦开始使用每个逻辑操作的上下文(在Web应用程序的情况下请求或操作),您可以向用户显示数据并让他进行修改,或者您可以再次尝试(如果处理锁定问题)。这当然不能解决您不验证用户输入的问题,因为这是必须修复的应用程序中的错误。如果您没有验证,则无法向用户显示数据有什么问题。

答案 1 :(得分:1)

您可以通过在上下文中遵循工作单元模式来保护自己免受这种情况的影响。

在这种情况下,来自不同用户的每次更新都会使用自己的上下文...因此如果一个错误存在,则不会影响其他用户。

看看:

Using Repository and Unit of Work patterns with Entity Framework 4.0

工作单元还将帮助您了解如何从错误中恢复。

由于单个工作单元本质上是单个事务,因此您只需回滚事务并通知用户(并允许他们修改数据并重试)。

相关问题