我想遍历一组对象并将它们全部添加到表中.目标表具有自动增量字段.如果我添加一个对象没有问题.如果我添加两个主键为零的对象,则实体框架失败.我可以手动指定主键,但尝试EF的重点是让生活变得更轻松而不是更复杂.这是代码,接收的异常如下.
foreach (Contact contact in contacts)
{
Instructor instructor = InstructorFromContact(contact);
context.AddToInstructors(instructor);
}
try
{
context.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)
错误是:
System.InvalidOperationException:已成功提交对数据库的更改,但更新对象上下文时发生错误.ObjectContext可能处于不一致状态.内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.在System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)
的System.Data.Objects.ObjectContext.SaveChanges()在DataMigration.Program.CopyInstructors()在C:\ Projects\DataMigration\Program.cs:第52行
我正在尝试学习如何使用实体框架,但我遇到了一个我无法解决的问题.我正在做的是,我正在浏览我拥有的电影列表,并将每个电影插入一个简单的数据库.
这是我正在使用的代码
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();
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我在db.SaveChanges()读取了一个异常.
已成功提交对数据库的更改,但更新对象上下文时发生错误.ObjectContext可能处于不一致状态.内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.
我无法找出造成这个问题的原因.我的数据库表包含三列
Id int autoincrement
Name nchar(255)
Path nchar(255)
更新:我检查了我的edmx文件,SSDL部分按照建议使用StoreGeneratedPattern ="Identity".我也跟着博客文章,试图在CSDL中添加ClientAutoGenerated ="true"和StoreGenerated ="true".这导致编译错误(错误5:不允许'ClientAutoGenerated'属性.).由于博客文章是从2006年开始的,并且它有一个后续帖子的链接,我认为它已被更改.
但是,我无法阅读后续帖子,因为它似乎需要一个msdn帐户.