【问题标题】:Cannot insert explicit value for identity column when IDENTITY_INSERT is set to OFF当 IDENTITY_INSERT 设置为 OFF 时,无法为标识列插入显式值
【发布时间】:2016-05-13 03:59:27
【问题描述】:

我正在尝试设置一个复合主键,第二个键是年份。

我在表创建和构造函数中都设置了自动生成字段,但我仍然得到这个错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表 Volunteer 中的标识列插入显式值。

代码和设置的所有三个部分如下。

  [Table("Volunteer")]
    public class Volunteer
    {

        [Key][Column(Order = 0)]
        public int Id { get; set; }

        [DisplayName("First Name")]
        public string FirstName { get; set; }

        [DisplayName("Last Name")]
        public string LastName { get; set; }

        [DisplayName("Team Mentored")]
        public string TeamMentored { get; set; }


        [Key][Column(Order = 1)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public DateTime Year { get; set; }
        public string TableNumber { get; set; }
        public int OfficeId { get; set; }
        public string Image { get; set; }


    }

CREATE TABLE [dbo].[Volunteer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](255) NULL,
    [LastName] [nvarchar](255) NULL,
    [TeamMentored] [nvarchar](255) NULL,
    [Year] [date] DEFAULT(getdate()) NOT NULL,
    [TableNumber] [nvarchar](50) NULL,
    [OfficeId] [int] NOT NULL,
    [Image] [nvarchar](max) NULL
 )


public ActionResult Create([Bind(Include = "FirstName,LastName,TeamMentored,TableNumber,OfficeId,Image")] Volunteer volunteer)
        {
            try
            {

                if (ModelState.IsValid)
                {
                    db.Volunteers.Add(volunteer);
                    db.SaveChanges();

                    ModelState.Clear();
                } 

                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                ModelState.AddModelError("", "DB Update Failed!"); 
            }

            return View();
        }

【问题讨论】:

  • 你在使用 EF Code First 吗?
  • 是的,我使用的是 EF 代码优先

标签: c# sql-server entity-framework linq asp.net-mvc-5


【解决方案1】:

尝试在“Id”属性上使用属性 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]。如果不这样做,是否可以发布分配代码并保存?

【讨论】:

  • 这仍然给我同样的错误,我已经尝试过没有 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]。
  • 您也不应该为“Id”属性分配任何值,让数据库为您生成值。
  • 我没有为 ID 或年份分配任何内容。
  • 尝试在“Id”属性上使用属性 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]。如果不这样做,是否可以发布分配代码并保存?
  • 还是同样的异常?您确定您的表格列是您发布的列吗?如果出现问题,请从数据库中删除 __MigrationsHistory 表
【解决方案2】:

您的属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 告诉实体框架(和 SQL Server)该属性将由数据库使用自动递增值自动生成。因此,您不能为其提供值。

如果它可以正常工作,您必须将其移至Id 属性。它可能会起作用,但我不能肯定地说,因为我以前没有使用过复合键。

如果您仍然收到错误,那是因为创建数据库时将Year 列设置为int identity(1,1)。手动编辑数据库,或者删除它并使用新的迁移重新创建它。

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 2019-03-10
    • 2018-06-29
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多