我正在尝试设置复合主键,第二个键是年份。
我已经在表创建和构造函数中设置了自动生成字段,但我仍然收到此错误:
当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();
}
答案 0 :(得分:6)
尝试在“Id”属性上使用属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]。如果不这样做,是否可以发布分配代码并保存?
答案 1 :(得分:1)
您的属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
告诉实体框架(和SQL Server)该属性将由数据库使用自动递增值自动生成。因此,您无法为其提供值。
如果它可以工作,则必须将其移至Id
属性。它可能会起作用,但我无法肯定地说,因为我之前没有使用复合键。
如果您仍然收到错误,那么这是因为数据库是在Year
列设置为int identity(1,1)
的情况下创建的。手动编辑数据库,或删除它并使用新的迁移重新创建它。