SaveChanges()在EF6中究竟做了什么?

时间:2016-01-10 19:29:37

标签: sql-server entity-framework transactions vb.net-2010

我正在尝试理解实体框架中的交易6 ..我搜索了很多,但我仍然感到困惑..

看看这个:

Dim transaction = context.Database.BeginTransaction()

Using transaction 
.
.
context.Entry(entity1).State = System.Data.EntityState.Added;
SaveChanges()
.
.
context.Entry(entity2).State = System.Data.EntityState.Added;
SaveChanges()
.
.
context.Entry(entity3).State = System.Data.EntityState.Added;
SaveChanges()

Transaction.Commit()
'Or Transaction.RollBack()
End using

现在SaveChanges()究竟做了什么?它与提交有什么不同?

是否为每个插入开始一个新的(可能是内部的)事务然后提交它?

我看了https://msdn.microsoft.com/en-us/data/dn456843.aspx

..这就是我所理解的“在所有版本的Entity Framework中,无论何时执行SaveChanges()在数据库上插入,更新或删除,框架都会将该操作包装在事务中。此事务仅持续足够长的时间来执行操作然后完成。当你执行另一个这样的操作时,会启动一个新的事务。“

1 个答案:

答案 0 :(得分:2)

我的理解是,对实体的所有更改(特别是存在级联删除的关系,或重新插入已删除的项目)是对操作进行排序,以便按正确的顺序执行。

例如,如果您有一个具有唯一约束的表,并且您已在具有约束的列上删除了一个具有唯一值的实体,并重新插入具有相同值的另一个实体,则操作将按正确的顺序执行因此底层dmbs不会抛出唯一约束异常。非自动递增的主键和其他各种各样的东西,但希望你得到它的要点。

实体存储在图形中,关系为边缘,因此它可以对图形进行排序并以正确的顺序执行操作。

这是由ChangeTracker执行的。我知道这是通过使用来自真棒IQToolkit的源代码来构建我自己的实体跟踪器。

我也明白这是在单个交易中执行的,如果底层的dmb支持它......

此外,在您的示例中,您只需要调用

SaveChanges()

每次更改实体后都不会。

您也不需要创建显式事务并提交它,因为SaveChanges在内部执行此操作,除非您需要由于某些外部因素而回滚事务

编辑

以粗体显式回答您的问题:

"现在SaveChanges()究竟做了什么?它与commit ??"

有何不同

它对每个对实体所做的更改生成的sql命令进行排序,并在单个事务中按照不违反数据库中任何关系或字段约束设置的顺序执行它们。由于它使用自己的事务,因此您不需要将操作包装在新事务中并提交它,除非您有理由由于某些外部因素而重新操作操作。

它与Commit不同,因为Commit将提交在事务期间进行的任何更改,而SaveChanges会在更新周围创建自己的事务并提交事务。您正在做的是将SaveChanges创建的事务嵌套在外部事务中,因此您可以根据需要取消它。

"它是否为每个插入开始一个新的(可能是内部的)事务然后提交它?"

不,它将它们全部包装起来并在一个内部事务中提交。