实体框架错误:无法在表中插入标识列的显式值

时间:2012-06-23 22:43:21

标签: c# sql entity-framework

我在EF上收到此错误。

  

无法在表中插入identity列的显式值   当IDENTITY_INSERT设置为OFF时,“GroupMembers_New”。

Db上的列是标识增量,在EF设计文件中,StoreGeneratedPattern也是identity。好像EF每次尝试保存时都试图插入0。

有些建议说ID会保留在表格中,或者删除表格并重新运行脚本。

有什么想法吗?

以下是一些代码:

GroupMember groupMember = new GroupMember();
            groupMember.GroupId = group.Id;
            groupMember.UserId = (new UserId(group.Owner));
            //groupMember.Id = _groupContext.GroupMembers.Count();
            group.GroupMembers.Add(groupMember);

            _groupContext.SaveChanges();

database

EF Designer

10 个答案:

答案 0 :(得分:55)

我之前遇到过这种情况。此错误意味着您尝试将值明确分配给数据库自动分配的列。

建议: 更新您的edmx文件以反映您可能在数据库中所做的任何更改。 如果数据库自动分配值,您应该在该属性下的设计器文件中看到“IsDbGenerated = true”属性。如果不存在,可以手动添加。

答案 1 :(得分:26)

试试这个:

using System.ComponentModel.DataAnnotations.Schema;
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public decimal Identity_Col { get; set; }

Entity Framework类文件将这些代码行添加到Identity列。

答案 2 :(得分:14)

将这些属性放在属性的顶部:

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

答案 3 :(得分:5)

谷歌的第一场比赛,所以这是我的解决方案:

EF代码优先:由于自动增加PK'id'字段和guid列,设计如下:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid FileToken { get; set; }

有一个重复的身份。我改成了:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("newid()")]
public Guid FileToken { get; set; }

问题消失了。

希望它对你有所帮助。

埃里克

答案 4 :(得分:3)

在EF 6中,模型中的字段/列有一个属性可用于执行此操作: StoreGeneratedPattern。

在属性下拉列表中将其设置为“Identity”。

(我不知道EF 4.上面的答案,使用IsDbGenerated,似乎适用于EF 4.)

这在底层XML中对应于元素的属性:

<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />

- 但您不需要手动处理XML,因为您可以使用设计器。

这是如何搞砸的还不清楚。从数据库中刷新模型后,我遇到了问题。如果在已经生成模型之后在表上设置PK或更改其名称,可能会感到困惑。 (我使用的是表/数据库优先方法,而不是代码优先。)

您不能使用上述方法将C#属性放在实体代码上,因为在这种情况下,实体代码由EF生成。 EF应该理解(“本身”)该字段是一个身份。

答案 5 :(得分:1)

我在我的应用中遇到过这个问题;并修复了它将id字段的属性“StoredGeneratedPattern”更改为Identity。

所以,转到模型;抬头看桌子;点击主要关键字的属性;并改变财产。

答案 6 :(得分:1)

请参见intercepting Entity Insert for generated always columns,例如历史记录表上的StartTime和EndTime列,以及rowversion列。

答案 7 :(得分:1)

我通过从插入数据中删除模型中的主键来解决这个问题。因为主键自增。

var book = new Book
   {
   //   Id = 1,  //Don't need to write this
        Genre = "Technology",
        Author = "Charles Petzold",
        Title = "Programming Windows 5th Edition",
        Price = 30,
        Publisher = "Microsoft Press"
    };

  _unitOfWork.Books.Add(book);
       

答案 8 :(得分:0)

我在AspNetCore 2.x应用程序中遇到了相同的问题和错误消息。 我唯一可以解决此问题的方法是通过删除DbContext类的ModelBuilder.Entity方法中的这一行:

// remove: entity.Property(e => e.Id).ValueGeneratedNever();

答案 9 :(得分:0)

嗯,你需要给 ID 一个值,例如对于对象 Auto,你应该 VarAuto.Id = 0;

之后你可以这样做=>

using( MyContext db = new MyContext()){

db.Autos.Add(VarAuto);
db.SaveChanges();
}

就是给id赋值的解决方案,EF可以识别表中的标识值。

尝试一下。

相关问题