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

What does SaveChanges() exactly do in EF6?

我正在尝试了解 entity framework 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

..这是我从 "In all versions of Entity Framework, whenever you execute SaveChanges() to insert, update or delete on the database the framework will wrap that operation in a transaction. This transaction lasts only long enough to execute the operation and then completes. When you execute another such operation a new transaction is started."

中了解到的

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

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

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

这是由 ChangeTracker 执行的。我通过使用来自很棒的 IQToolkit 的源代码来构建我自己的实体跟踪器来了解这一点。

我也明白这是在单笔交易中进行的,如果底层dmbs支持的话...

另外,在你的例子中,你只需要调用

SaveChanges()

一次,而不是在每次更改实体之后。

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

编辑

要以粗体明确回答您的问题:

"Now what exactly does SaveChanges() Do? and how does it differ from the commit??"

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

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

"Does it begin a new (maybe internal) transaction for each insert and then commit it?"

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