使用实体框架自动编号

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".它应该有所帮助.

  • 请注意,您不能只在设计器中设置此属性,您必须手动编辑SSDL部分.我读过这个答案,并想:"我已经做到了.",我一直在寻找,我可以通过注意*SSDL来节省时间*这是设计师中的一个知道错误.http://geeksharp.com/2010/05/27/ef4-bug-in-storegeneratedpattern-ssdl/和http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/404d3017-01b7 -4129-8e05-f4aa48f15f08 (7认同)

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中是否所有这些问题都已修复.

  • 我想我出错的地方在于我最初从数据库创建模型并忘记设置自动编号字段.LaterI编辑了我的数据库并设置了此属性,然后在visual studio 2010中设置了"从数据库更新模型"命令.更新功能似乎添加了新属性,但不能确定它是否正确"修复"了现有的已修改属性.通过删除我的模型并从头开始重新创建,自动编号功能按预期工作.但是,如果我知道的更好,我会尝试你的想法. (2认同)
  • Microsoft为VS2010SP1提供了此修补程序.http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=37957它似乎对我有用. (2认同)

yu *_*ian 6

我正在使用 EF6,要设置 StoreGeneratedPattern,您也可以尝试在 Visual Studio 中打开 EDMX 文件,右键单击表中的数据列并选择属性,

然后你可以在属性窗口中将其设置NoneIdentity