EF代码首先给我错误当IDENTITY_INSERT设置为OFF时,无法在表'People'中为标识列插入显式值。

我尝试了entity framework4的Code First(EF CodeFirst 0.8),并遇到PersonProfile之间具有1 < – > 0..1关系的简单模型的问题。 以下是他们如何定义:

 public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime? DOB { get; set; } public virtual Profile Profile { get; set; } } public class Profile { public int ProfileId { get; set; } public int PersonId { get; set; } public string DisplayName { get; set; } public virtual Person Person { get; set; } } 

数据库上下文看起来像这样:

 public class BodyDB : DbContext { public DbSet<Person> People { get; set; } } 

我没有为Profile定义DbSet ,因为我认为People是它的聚合根。 当我试图添加一个新的Person – 即使没有一个Profile与此代码:

 public Person Add(Person newPerson) { Person person = _bodyBookEntities.People.Add(newPerson); _bodyBookEntities.SaveChanges(); return person; } 

我得到以下错误:

当IDENTITY_INSERT设置为OFF时,无法在表'People'中插入标识列的显式值。

当我调用People.Add()时, newPerson对象的PersonId属性为0 。 数据库表是PeopleProfilesPersonId是人的PK,是一个自动增量的身份。 ProfileIdProfiles的PK,是自动入口标识。 PersonIdProfiles的非null int列。

我究竟做错了什么? 我认为我坚持所有的EF Code First的惯例,configuration规则。

我得到以下错误:当IDENTITY_INSERT设置为OFF时,无法在表'People'中为标识列插入显式值。

我认为IDENTITY_INSERT是closures的自动递增function。 所以,检查数据库中的字段PersonId,看看它是否是一个身份。

此外,也许这会解决你的问题。

 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int PersonId { get; set; } 

如果您执行以下步骤,则会发生这种情况:

  1. 在表上创build一个非标识PK字段。
  2. 从该表推断实体模型。
  3. 回去并将PK身份设置为true。

实体模型和数据库不同步。 刷新模型将修复它。 我昨天不得不这样做。

如果您使用的是EF Code First,那么除了像这里所build议的那样,将[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]注释属性添加到model.cs文件之外, 需要在modelMap上进行相同的有效更改。 cs文件(stream畅的映射指令):

变更自:

 this.Property(t => t.id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

至:

 this.Property(t => t.id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

(我使用EF Power Tools来生成实体模型和默认映射文件,然后将一个Id列转换为prmary key列,并将其设置为Sql Server中的IDENTITY,因此,我必须更新属性和默认映射文件。)

如果两个地方都不改变,你仍然会得到同样的错误。

我没有这个问题, 直到我添加了一个复合键 ,所以一旦我有2个主键这与EF 6.xx发生

在我的密钥“身份证”其身份规范设置为真我需要添加

 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 

模型属性现在:

 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] [Key, Column("Id", Order = 1)] public int Id { get; set; } [Key, Column("RanGuid", Order = 2)] public string RanGuid { get; set; } 

您的情况提醒我,当我使用EF Code First时,PrimaryKey和ForeignKey是同一列的情况。

没有直接的方法来刷新模型,但同样的效果可以在两个步骤中实现。

  1. 在Profile类中注释掉ProfileId。 重新编译和更新数据库。
  2. 取消注释configuration文件ID,添加DatabaseGeneratedAttribute并再次更新数据库。
 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key] 

在EF6中发现了这个错误,查看了数据库,一切看起来都正确, Identity Specification设置为Yes 。 然后,我删除了不同的迁移,并从当前的模型进行了一次新的迁移,然后一切开始工作。 由于应用程序还没有正式开发,所以仍然是最快的解决scheme。

在这里输入图像说明

当IDENTITY_INSERT设置为OFF时,不能在表“Test”中为标识列插入显式值。

在我的情况下,似乎EF不喜欢其他types比INT身份领域 – 我的是字节 (TINYINT在SQL方面)。

因为我能够更新我的项目并将其更改为SQL上的INT ,所以在VisualStudio上重新运行反向工程代码后,错误立即停止发生。

在我的情况下,似乎EF不喜欢其他types比INT身份领域 – 我的是字节(TINYINT在SQL方面)。

我也使用了tinyinttypes的PK。 这并不是说EF不喜欢它,似乎与其他情况不同,你必须在你的configuration中指定如下:

this.Property(t => t.TableID).HasColumnName(“TableID”)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

这是解决scheme。 另请参阅附件以获取更多帮助。

导航到您的EF模型“.edmx”文件>>打开它>>现在右键单击该图并select“从数据库更新模型”。

这将解决这个问题,因为你在创buildEF模型之后在数据库中创build了PK。

有助于重build上述步骤

为了search者的利益:我得到了这个错误,但是上面的修复无效。 这是由于我的错误。

在我的表上,我有一个Guid主键(非集群)和一个int索引。

尝试更新“博客”信息作为导航属性时发生错误。 见以下课程:

 public class Blog { public Guid BlogId { get; set; } public int BlogIndex { get; set; } // other stuff } public class Post { public Guid PostId { get; set; } public int PostIndex { get; set; } // other stuff public Blog Blog { get; set; } } 

问题是,当我将DTO转换为模型时,BlogId被改为一个new Guid() (我在映射中发生错误)。 由此产生的错误是在这个问题中详细的相同。

为了解决这个问题,我需要检查插入的数据是否正确(不是),并修正了数据的不正确的变化(在我的情况下,破碎的映射)。