62

我在 EF 上收到此错误。

当 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();

数据库

EF 设计器

4

12 回答 12

77

我以前遇到过这个。此错误意味着您正在尝试将值显式分配给数据库自动分配的列。

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

于 2012-06-24T01:44:38.513 回答
42

试试这个:

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

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

于 2012-11-11T00:20:12.313 回答
21

将这些属性放在身份属性之上:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
于 2014-05-22T11:57:58.127 回答
8

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

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

有重复的身份。我将其更改为:

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

问题就消失了。

于 2016-11-01T16:32:23.547 回答
4

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

在属性下拉列表中将此设置为“身份”。

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

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

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

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

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

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

于 2013-12-25T05:59:52.090 回答
4

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

// remove: entity.Property(e => e.Id).ValueGeneratedNever();
于 2019-03-08T12:41:40.407 回答
2

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

所以,转到模型;查找桌子;单击主键字段的属性;并更改属性。

于 2017-11-01T14:17:40.597 回答
1

请参阅拦截实体插入以获取生成的 always 列,例如历史表上的 StartTime 和 EndTime 列,以及 rowversion 列。

于 2020-07-04T17:00:33.287 回答
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);
       
于 2021-03-27T17:32:03.663 回答
0

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

之后你可以这样做=>

using( MyContext db = new MyContext()){

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

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

你试一试。

于 2021-03-11T23:02:36.270 回答
0

我首先使用 DB,并且该表具有标识列。我没有使用 db-scaffolding 来生成它,我从另一个实体复制了它,并且错误地使用了这个属性。

所以

尝试检查 DBContext 类。我收到了这个错误,问题出在这个属性“.ValueGeneratedNever()”上,我刚刚删除了它,它工作正常,

modelBuilder.Entity<TableName>(entity =>
        {
            entity.Property(e => e.Id)
                //.ValueGeneratedNever()
                .HasColumnName("ID");
        });
于 2021-09-12T14:53:20.233 回答
0

注意:版主删除了这个答案作为重复,并留下了我的另一个答案,一个只有 sql-server 标签的问题(这是我从谷歌得到的第一个问题)。由于这个问题有实体框架标签,所以在这里再次发布答案。

这适用于 EntityFramework Core 3.1.22。使用错误的属性来指定外键会导致 Entity Framework 将主键降级为……其他东西。然后,实体框架将始终尝试插入显式值,这会引发数据库异常,因为它无法插入被告知是主键且不应插入的值。

Microsoft.EntityFrameworkCore.DbUpdateException: 'An error occurred while updating the entries. See the inner exception for details.'
Inner Exception:
SqlException: Cannot insert explicit value for identity column in table 'FOO' when IDENTITY_INSERT is set to OFF.

代码示例。我们有一个一对一的类映射:

    public class Foo /* child */
    {
        public int FooPrimaryKey { get; set; }
        public int BarPrimaryKey { get; set; }
        public virtual Bar PropertyBar {get; set; }
    }

    public class Bar
    {
        public int BarPrimaryKey { get; set; }
        public virtual Foo PropertyFoo {get; set; }
    }

    modelBuilder.Entity<Foo>(entity =>
    {
        entity.HasKey(e => e.FooPrimaryKey);

        entity.ToTable("FOO", "dbo");
        
        entity.HasOne(d => d.PropertyBar)
            .WithOne(x => x.PropertyFoo)
            // wrong, this throws the above exception
            .HasForeignKey<Bar>(x => x.BarPrimaryKey);
    });

外键应该是(相同的键,不同的类型):

    .HasForeignKey<Foo>(x => x.BarPrimaryKey);
于 2022-01-30T00:52:47.333 回答