EF代码首先给我错误当IDENTITY_INSERT设置为OFF时,无法在表'People'中为标识列插入显式值。
我尝试了entity framework4的Code First(EF CodeFirst 0.8),并遇到Person
和Profile
之间具有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
。 数据库表是People
和Profiles
。 PersonId
是人的PK,是一个自动增量的身份。 ProfileId
是Profiles
的PK,是自动入口标识。 PersonId
是Profiles
的非null int列。
我究竟做错了什么? 我认为我坚持所有的EF Code First的惯例,configuration规则。
我得到以下错误:当IDENTITY_INSERT设置为OFF时,无法在表'People'中为标识列插入显式值。
我认为IDENTITY_INSERT是closures的自动递增function。 所以,检查数据库中的字段PersonId,看看它是否是一个身份。
此外,也许这会解决你的问题。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int PersonId { get; set; }
如果您执行以下步骤,则会发生这种情况:
- 在表上创build一个非标识PK字段。
- 从该表推断实体模型。
- 回去并将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是同一列的情况。
没有直接的方法来刷新模型,但同样的效果可以在两个步骤中实现。
- 在Profile类中注释掉ProfileId。 重新编译和更新数据库。
- 取消注释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()
(我在映射中发生错误)。 由此产生的错误是在这个问题中详细的相同。
为了解决这个问题,我需要检查插入的数据是否正确(不是),并修正了数据的不正确的变化(在我的情况下,破碎的映射)。
- 一对一使用entity framework代码的可选关系
- 不使用存储库模式,使用ORM原样(EF)
- 更新行,如果它存在Else插入逻辑与entity framework
- 如何在代码中使用视图第一个entity framework
- dynamicMySQL数据库连接entity framework6
- entity frameworkasynchronous操作需要十倍的时间才能完成
- entity framework中的连接子句中的一个expression式的types不正确
- 左joinLINQ到实体?
- asynchronousPartialView导致“HttpServerUtility.Execute阻止…”exception