自动编号与entity framework

我想循环一个对象的集合,并将它们全部添加到表中。 目标表有一个自动增量字段。 如果我添加一个对象没有问题。 如果我添加两个主键为零的对象,则entity framework将失败。 我可以手动指定主键,但尝试EF的全部重点是让生活更轻松,不会更复杂。 下面是代码和接收到的exception。

foreach (Contact contact in contacts) { Instructor instructor = InstructorFromContact(contact); context.AddToInstructors(instructor); } try { context.SaveChanges(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } 

错误是:

System.InvalidOperationException :数据库的更改已成功提交,但更新对象上下文时发生错误。 ObjectContext可能处于不一致的状态。 内部exception消息:由于对象的键值与ObjectStateManager中的另一个对象冲突,因此AcceptChanges无法继续。 在调用AcceptChanges之前,确保键值是唯一的。 在System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)
在System.Data.Objects.ObjectContext.SaveChanges()在DataMigration.Program.CopyInstructors()在C:\ Projects \ DataMigration \ Program.cs中:第52行

将自动增量字段中的StoreGeneratedPattern属性设置为SSDL中的“Identity”。 它应该帮助。

发生这种情况是因为尽pipe在数据库中创build了列的自动生成值,但EF永远不知道该值。

因此,为了通知EF数据库将处理生成的值,您必须打开您的edmx文件(我总是使用VS的XML编辑器来执行此操作),并在商店架构定义语言(SSDL)区域中添加将StoreGeneratedPattern =“Identity”属性添加到需要生成的模式的列中。 通过这种方式,EF读取DB中生成的值并将其存储在内存caching中。

你的实体types定义看起来或多或less像这样:

  <EntityType Name="INVOICE"> <Key> <PropertyRef Name="CODE" /> </Key> <Property Name="CODE" Type="varchar" Nullable="false" MaxLength="10" StoreGeneratedPattern="Identity"/> </EntityType> 

请注意,如果您碰巧更新了模型,所有这些更改都将丢失,您将不得不重复整个过程。

这适用于EF 1.0,我不确定在EF4中所有这些问题是否已经解决。

我正在使用EF6来设置StoreGeneratedPattern,您也可以尝试在Visual Studio中打开EDMX文件,右键单击表格中的Data Column并selectProperties,

然后你可以在属性窗口中将它从None设置为Identity