在.NETentity framework中调用SaveChanges时出现InvalidOperationException

我正在尝试学习如何使用entity framework,但我遇到了一个我无法解决的问题。 我正在做的是,我正在浏览我拥有的电影列表,并将每个电影插入一个简单的数据库中。

这是我正在使用的代码

private void AddMovies(DirectoryInfo dir) { MovieEntities db = new MovieEntities(); foreach (DirectoryInfo d in dir.GetDirectories()) { Movie m = new Movie { Name = d.Name, Path = dir.FullName }; db.AddToMovies(movie); } db.SaveChanges(); } 

当我这样做时,我在db.SaveChanges()读取了一个exception。

已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。 内部exception消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。 在调用AcceptChanges之前,请确保键值是唯一的。

我无法找出造成这个问题的原因。 我的数据库表包含三列
Id int autoincrement
名称nchar(255)
路径nchar(255)

更新:我检查了我的edmx文件,SSDL部分按照建议使用StoreGeneratedPattern =“Identity”。 我也跟着博客文章,试图在CSDL中添加ClientAutoGenerated =“true”和StoreGenerated =“true”。 这导致编译错误(错误5:不允许’ClientAutoGenerated’属性。)。 由于博客文章是从2006年开始的,它有一个后续post的链接,我认为它已被更改。

但是,我无法阅读后续post,因为它似乎需要一个msdn帐户。

我找到了解决方案。

发生了什么事情,当我创建我的表时,我忘了添加主键并将(Is Identity)属性设置为yes。 然后我创建了我的实体模型并得到了这个错误。

我回去修复了我的数据库表,但我仍然讨厌奇怪的exception。 最终解决问题的方法是删除实体并在修复表后重新创建它。

没有更多例外:)

上次我尝试下面的代码,我说它工作正常

 bs.SuspendBinding(); Data.SaveChanges(); bs.ResumeBinding(); 

我今天告诉你的重要事情是:

1-如果我们使用上面的代码来暂停绑定,我们必须做更多的代码来修复很多场景,比如集合中丢失的索引和主细节绑定

2-如果我们使用以下代码而不是上面的代码,我们将看到exception消失,并且每个东西都可以,无需编写更多代码

  Data.SaveChanges(System.Data.Objects.SaveOptions.None); 

我希望这能解决你的类似问题

谢谢你的朋友们

此exception似乎告诉您在Id列中的几行中具有相等的值,该列应该只具有唯一值,因为它是一个键列。 entity framework可以通过两种方式处理此类列:您(客户端)生成唯一值,或者服务器生成唯一值。 在您的情况下,允许服务器生成自动增量密钥似乎是合乎逻辑的。

您是否在SSDL文件中为Id列设置了StoreGeneratedPattern键?

以下是此博客中的示例:

     
 System.Data.Objects.SaveOptions.None 

这解决了问题,但我想知道uning none或其他选项之间的区别。

如果绑定了绑定源,则应调用suspendbinding:

  bs.SuspendBinding(); Data.SaveChanges(); bs.ResumeBinding(); 

检查您的任何一个是否缺少主键,如果是,则创建它们,并执行“从数据库更新模型”

这应该解决问题

另外,检查是否将另一列的“Is Identity”属性设置为“yes”,并在其中插入重复的值。

我有类似的问题,表关系跨越三个级别,如Customer-> Order-> Order-Details with oracle 12C Auto-ID Trigger for key generation。 使用SaveChanges()插入时抛出System.InvalidOperationException

解决方案:扩充函数SaveChanges(System.Data.Objects.SaveOptions.None)可防止系统在对象图状态下使用临时EntityKeys ,并避免结果exception。