当标识列设置为 OFF 时,无法插入标识列IDENTITY_INSERT显式值

本文关键字:标识 IDENTITY INSERT 插入 设置 OFF | 更新日期: 2023-09-27 18:33:14

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

我已经在表创建和构造函数中设置了自动生成字段,但我仍然收到此错误:

当 IDENTITY_INSERT 设置为"关"时,无法在表 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();
        }

当标识列设置为 OFF 时,无法插入标识列IDENTITY_INSERT显式值

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

属性

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

如果它完全有效,则必须将其移动到Id属性。它可能会起作用,但我不能肯定地说,因为我以前没有使用过复合键。

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

我不得不在 ID 属性上使用两个属性:

    [Key] // not [ExplicitKey]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; }

第一个来自Dapper.Contrib.Extensions

第二个来自System.ComponentModel.DataAnnotations.Schema