C# MVC-当identity\U insert设置为OFF时,无法在表中插入identity列的显式值
提交模型的创建表单时,出现错误:C# MVC-当identity\U insert设置为OFF时,无法在表中插入identity列的显式值,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,提交模型的创建表单时,出现错误: {"Cannot insert explicit value for identity column in table 't_bcim_project_clearance' when IDENTITY_INSERT is set to OFF."} 我可以看到这个问题被问了很多次,但我对代码做了很多修改,但一点运气都没有。我很抱歉之前有这么多的代码,我通常会让人们在评论中抱怨我没有发布足够的代码,所以这次我尝试包含所有可能相关的内容 我的控制器中引发此错误的方
{"Cannot insert explicit value for identity column in table 't_bcim_project_clearance' when IDENTITY_INSERT is set to OFF."}
我可以看到这个问题被问了很多次,但我对代码做了很多修改,但一点运气都没有。我很抱歉之前有这么多的代码,我通常会让人们在评论中抱怨我没有发布足够的代码,所以这次我尝试包含所有可能相关的内容
我的控制器中引发此错误的方法是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MaintenanceForm([Bind(Exclude = "project_clearance_id")]t_bcim_project_clearance project)
{
if (ModelState.IsValid)
{
if (entities.t_bcim_project_clearance.Any(x => x.project_clearance_id == project.project_clearance_id))
{
entities.Entry(project).State = EntityState.Modified;
}
else
{
entities.t_bcim_project_clearance.Add(project);
}
entities.SaveChanges();
return RedirectToAction("Maintenance", new { SubmissionNumber = project.Submission_Number, Mode = "Edit" });
}
var model = new ProjectViewModel()
{
Project = entities.t_bcim_project_clearance.Find(project.project_clearance_id),
States = states,
Branches = branches,
Divisions = divisions,
ProjectTypes = project_types,
Statuses = statuses,
ReadOnly = false,
Mode = "Edit",
Cleared = false
};
return RedirectToAction("Maintenance", new { SubmissionNumber = project.Submission_Number, Mode = "Edit" });
}
在entities.SaveChanges()行代码><代码>实体
是用于连接SQL数据库的上下文类
下面是相应的GET方法:
[HttpGet]
public ActionResult MaintenanceForm(string SubmissionNumber, string Mode, int? id)
{
if (!Mode.Equals("Edit", StringComparison.InvariantCultureIgnoreCase) && !Mode.Equals("View", StringComparison.InvariantCultureIgnoreCase))
{
throw new HttpException(400, "Mode must be either \"Edit\" or \"View\"");
}
var model = new ProjectViewModel()
{
Project = id.HasValue ? entities.t_bcim_project_clearance.Find(id) : (String.IsNullOrEmpty(SubmissionNumber) ? null : new t_bcim_project_clearance() { Submission_Number = Convert.ToDouble(SubmissionNumber) }),
Statuses = statuses,
Divisions = divisions,
Branches = branches,
ProjectTypes = project_types,
States = states,
Projects = entities.t_bcim_project_clearance.Where(s => s.Submission_Number.ToString().Equals(SubmissionNumber)),
SubmissionNumber = SubmissionNumber,
ReadOnly = (Mode == "View"),
Mode = Mode,
Cleared = false
};
return PartialView("_MaintenanceForm", model);
}
我的模型是DBmodel。这是该模型中的违规属性:
namespace ProjectClearanceApp.Models
{
using System;
using System.Collections.Generic;
public partial class t_bcim_project_clearance
{
// A lot of other properties
public int project_clearance_id { get; set; }
}
}
我创建了一个分部类来添加DataAnnotation,如下所示:
namespace ProjectClearanceApp.Models
{
[MetadataType(typeof(t_bcim_project_clearanceMetaData))]
public partial class t_bcim_project_clearance
{
}
public class t_bcim_project_clearanceMetaData
{
// a lot of other properties
[Key]
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int project_clearance_id { get; set; }
}
}
Myproject\u clearance\u id
被设置为My表的主键,标识增量=1
我到目前为止所做的尝试:
- 最初,我的控制器使用预先计算的ID生成新项目,所以很明显我删除了它
- 我将所有的DataAnnotation添加到该分部类的ID属性中
- 我以前在表单顶部有
,但我删除了它Html.HiddenFor(model=>model.project\u clearance\u id)
- 我在POST方法的参数中添加了
[Bind(Exclude=“project\u clearance\u id”)]
编辑:我进入模型的.edmx图表,右键单击
项目\u clearance\u id
,打开属性,并将存储生成模式
更改为标识
。现在,当我尝试创建一个新条目时,代码工作正常,但是当我尝试编辑一个现有条目时,它使用修改后的字段创建一个新条目,而原始条目仍然像以前一样存在。您的问题是,您正在尝试插入/更新数据库记录,并且在生成的SQL中,您正在将映射到t\u bcim\u project\u clearance
列的字段设置为特定值,但是,由于已将此设置为标识,因此不允许执行此操作,因为其值是自动设置的
您需要确保映射到此列的对象中的值未被修改或标记为已修改
不要使用entities.Entry(project).State=EntityState.Modified
,而是将每个属性实际处于修改状态,而不是对象本身。要将属性设置为已修改,可以执行以下操作:
db.Entry(project).Property(x => x.PropertyName).IsModified = true;
执行.Add()
时,请确保属性project\u clearance\u id
的值设置为0
编辑每个评论的附加信息:
- 如果删除了
,请确保将其包含在视图中。如果您正在执行更新,则需要这样做Html.HiddenFor(model=>model.project\u clearance\u id)
- 从参数中删除
属性,因为在执行更新时需要此值[Bind(Exclude=“project\u clearance\u id”)]
t\u bcim\u project\u clearance
不是一列,它是我的模型周围构建的表的名称。因此,当在新项目上引发此错误时,project\u clearance\u id
在处设置的断点处设置为0。add()
。我还将修改后的状态行更改为您对每个属性的建议(首先我尝试将项目\许可\ id
包含在此列表中,然后我尝试不使用它),但它仍然无法更新表中的项目。请参阅我的编辑。我用您建议的.IsModified
更改和以前的代码尝试了这两种方法——当我尝试编辑现有项目时,这两种方法都会产生一个新项目。这总是会发生的,因为您有[Bind(Exclude=“project\u clearance\u id”)]
。如果要执行更新,则需要该值。我的建议是将API分成两个独立的端点。一个用于创建新的,一个用于更新。噢,哇,谢谢!我删除了这个排除项,并将Html.HiddenFor(model=>model.Project.Project\u clearance\u id)
重新添加到我的表单中,现在它可以很好地用于创建和编辑。