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

mqkwyuun  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(153)

我尝试设置一个复合主键,第二个键是年份。
我已经在表创建和构造函数中设置了自动生成字段,但仍然出现以下错误:
当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();
        }
wixjitnu

wixjitnu1#

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

trnvg8h3

trnvg8h32#

您的属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]告知Entity Framework(和SQL Server),数据库将使用自动递增的值自动产生属性。因此,您无法提供值给它。
如果真的能用的话,你必须把它移到Id属性中。它可能会用,但是我不能肯定,因为我以前没有用过复合键。
如果仍然出现错误,则是因为数据库是在将Year列设置为int identity(1,1)的情况下创建的。请手动编辑数据库,或删除数据库,然后使用新的移植重新创建数据库。

8yparm6h

8yparm6h3#

I had to use two attributes on the ID property:

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

The first is from Dapper.Contrib.Extensions
the second from System.ComponentModel.DataAnnotations.Schema

相关问题