【问题标题】:Entity Framework error: Cannot insert explicit value for identity column in table实体框架错误:无法为表中的标识列插入显式值
【发布时间】:2012-06-25 18:39:34
【问题描述】:

我在 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();

【问题讨论】:

标签: c# sql entity-framework


【解决方案1】:

我以前遇到过这种情况。此错误表示您正在尝试将值显式分配给数据库自动分配的列。

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

【讨论】:

  • 确实,更新 edmx 是解决方案。谢谢
  • 在 edmx 设计器中的 ef5 中有一个针对名为“StoreGeneratedPatern”的字段的属性 - 将其设置为“Identity”
【解决方案2】:

试试这个:

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

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

【讨论】:

  • 但这也会生成 id 。如果我想自己指定值并将其用作表的主键。
  • 首先使用 EF Core-code,我有一个带有复合键的表,其中一列是 Identity。添加属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 对我有用。
  • 这也让我摆脱了一个奇怪的问题——谢谢。
【解决方案3】:

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

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

【讨论】:

  • 这似乎不适用于 Azure 移动服务。我有一个将此作为字段的模型: [Index(IsClustered = true)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [TableColumnAttribute(TableColumnType.CreatedAt)] public DateTimeOffset? CreatedAt {获取;放; }
  • 我添加了属性,现在我得到这个错误:“ReferentialConstraint 中的依赖属性被映射到存储生成的列”
  • 首先使用 EF Core-code,我有一个带有复合键的表,其中一列是 Identity。添加属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 对我有用。
【解决方案4】:

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

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

有重复的身份。我把它改成:

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

问题就解决了。

【讨论】:

  • 首先使用 EF Core-code,我有一个带有复合键的表,其中一列是 Identity。添加属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 对我有用。
【解决方案5】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

    • 哇,你拯救了我的一天!这实际上是问题所在......自动脚手架确实生成了这条线并且造成了这样的麻烦!
    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

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

          之后你可以这样做 =>

          using( MyContext db = new MyContext()){
          
          db.Autos.Add(VarAuto);
          db.SaveChanges();
          }
          

          也就是只给id赋值,EF可以识别表中的identity值。

          试试吧。

          【讨论】:

            【解决方案11】:

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

            所以

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

            modelBuilder.Entity<TableName>(entity =>
                    {
                        entity.Property(e => e.Id)
                            //.ValueGeneratedNever()
                            .HasColumnName("ID");
                    });
            

            【讨论】:

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

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

            这适用于 EntityFramework Core 3.1.22。使用错误的属性来指定外键会导致 Entity Framework 将主键降级为……其他东西。然后,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);
            

            【讨论】:

              猜你喜欢
              • 2017-03-05
              • 2020-11-22
              • 2014-05-24
              • 1970-01-01
              • 2015-07-02
              • 1970-01-01
              • 2019-11-29
              • 2012-09-25
              相关资源
              最近更新 更多