我遇到这种情况,其中EF6用于将对象保存到数据库(分成2个单独的表)。因此,通过在EF中执行SaveChanges()
,这会生成2个单独的exec sp_executesql insert...
语句。
这是从第一个插入生成的值将用作第二个语句的输入参数。
我注意到的一件事是,当第二个语句在一个案例中失败时,没有写入任何记录。
我启动了SQL-Profiler并且没有看到任何回滚;似乎无法弄清楚这次回滚是如何实际发生的。
感谢任何建议。
答案 0 :(得分:1)
我注意到的一件事是,当第二个陈述在一个案例中失败时,没有写入任何记录。
我启动了SQL-Profiler并且没有看到任何回滚;似乎无法弄清楚这次回滚是如何实际发生的。
通过在EF上下文中调用SaveChanges()
,对您的实体进行的所有修改(插入,更新,删除等)都将包装到单个SQL事务中。这是EF中的默认行为。
事务的目的是将所有SQL语句作为单个操作,一个工作单元。如果一个语句在中间或结尾处失败,那么所有传递的语句都会回滚,即使是那些成功执行的语句也是如此。
为防止出现这种情况,您可以针对在EF上下文中所做的每项更改单独调用SaveChanges()
。