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

Hom*_*osa 46 c# sql entity-framework

我在EF上遇到这个错误.

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

在分贝列标识增量并在EF的设计文件,StoreGeneratedPatternidentity为好.好像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();
Run Code Online (Sandbox Code Playgroud)

数据库

EF设计师

小智 60

我以前碰到过这个.此错误意味着您尝试将值明确分配给数据库自动分配的列.

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

  • 实际上,更新edmx是解决方案.谢谢 (5认同)
  • 在edmx设计器的ef5中,有一个名为'StoreGeneratedPatern'的字段的属性 - 将其设置为'Identity' (3认同)

小智 29

试试这个:

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

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

  • 但这也会产生id.如果我想自己指定值并将其用作表的主键,该怎么办? (2认同)
  • 首先使用 EF Core 代码,我有一个带有组合键的表,其中一列是 Identity。添加属性“[DatabaseGenerate(DatabaseGenerateOption.Identity)]”对我有用。 (2认同)

Ami*_*aqi 16

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

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 我添加了属性,现在我收到此错误:"ReferentialConstraint中的依赖属性映射到存储生成的列" (2认同)

小智 8

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

// remove: entity.Property(e => e.Id).ValueGeneratedNever();
Run Code Online (Sandbox Code Playgroud)

  • 哇,你救了我的命!这实际上是问题所在...自动脚手架确实生成了这条线并造成了如此大的麻烦! (2认同)

小智 6

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

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid FileToken { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("newid()")]
public Guid FileToken { get; set; }
Run Code Online (Sandbox Code Playgroud)

问题就消失了.

希望它能帮到你.

埃里克