dco*_*led 15 c# entity-framework exception auto-increment
我想遍历一组对象并将它们全部添加到表中.目标表具有自动增量字段.如果我添加一个对象没有问题.如果我添加两个主键为零的对象,则实体框架失败.我可以手动指定主键,但尝试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行
Dev*_*art 18
在自定义增量字段的SSDL中将StoreGeneratedPattern属性设置为"Identity".它应该有所帮助.
cep*_*ego 12
发生这种情况是因为尽管在数据库中创建了列的自动生成值,但EF从未知道它.
因此,为了通知EF数据库将处理生成的值,您必须打开edmx文件(我总是使用VS的XML编辑器来执行此操作),并在商店架构定义语言(SSDL)区域中添加属性 StoreGeneratedPattern ="Identity"到需要生成的模式的列.通过这种方式,EF读取DB中生成的值并将其存储在内存缓存中.
您的实体类型定义看起来或多或少如下:
<EntityType Name="INVOICE">
<Key>
<PropertyRef Name="CODE" />
</Key>
<Property Name="CODE" Type="varchar" Nullable="false"
MaxLength="10" StoreGeneratedPattern="Identity"/>
</EntityType>
Run Code Online (Sandbox Code Playgroud)
请注意,如果您碰巧更新了模型,所有这些更改都将丢失,您将不得不重复所有整个过程.
这适用于EF 1.0,我不确定在EF4中是否所有这些问题都已修复.
我正在使用 EF6,要设置 StoreGeneratedPattern,您也可以尝试在 Visual Studio 中打开 EDMX 文件,右键单击表中的数据列并选择属性,
然后你可以在属性窗口中将其设置None为Identity: