不同的EF 4 SaveOptions对ObjectContext有什么影响?

时间:2011-01-12 20:21:14

标签: entity-framework-4

我正在尝试解决与此处概述的错误类似的错误:

InvalidOperationException when calling SaveChanges in .NET Entity framework

似乎解决方案(我还没有尝试过),将System.Data.Objects.SaveOptions.None作为SaveChanges()方法的SaveOptions参数传递。

所以在我这样做之前,我试图准确理解不同的SaveOptions是如何工作的(None,AcceptAllChangesAfterSave,DetectAllChanges)。然而,我无法找到明确的解释,也不确定默认是什么。任何人都可以澄清吗?

谢谢!

更新:我在此处发布了实际问题:System.InvalidOperationException when trying to iteratively add objects using EF 4

2 个答案:

答案 0 :(得分:18)

的简短修正
  

SaveOptions.DetectChangesBeforeSave:这是默认值。当你这样做   ObjectContext.SaveChanges(),调用DetectChanges()方法   OSM中的同步附加实体。

SaveChanges是SaveChanges(SaveOptions optsions)方法的重载版本,此无参数版本调用此方法

SaveChanges(SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave)

SaveOptions是一个标记枚举,最后,SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSaveSaveChanges()的默认值,而不是DetectChangesBeforeSave

答案 1 :(得分:17)

简而言之(根据我的理解):

SaveOptions.DetectChangesBeforeSave:这是默认设置。执行ObjectContext.SaveChanges()时,将调用方法DetectChanges()以在OSM中同步附加实体。

SaveOptions.AcceptAllChangesAfterSave:执行ObjectContext.SaveChanges()时,调用方法AcceptAllChanges() - 这是OSM的内核,其中图中的实体被迭代,地址和设置为不变/拆卸。

SaveOptions.None:执行ObjectContext.SaveChanges()时,会立即保存更改 - 根本不会同步。无论图表中的内容是什么都将被保存。

根据我的经验,我没有改变这个 - 我把它作为默认值(DetectChangesBeforeSave)。

有时使用POCO我听说你需要明确地调用DetectChanges,但我从未见过将SaveOptions更改为none的推荐/解决方案。

您确定该问题的解决方案是将SaveOptions设置为none吗?也许你应该提供关于你得到的错误的细节(或问一个单独的问题),因为这样的改变会影响你的整个持久层。