【发布时间】:2017-12-17 04:32:42
【问题描述】:
为我的模型提交创建表单时,我收到错误:
{"Cannot insert explicit value for identity column in table 't_bcim_project_clearance' when IDENTITY_INSERT is set to OFF."}
我可以看到这个问题被问了很多,但我对我的代码做了很多更改,但一点运气都没有。很抱歉,代码太多了,我通常会让人们在 cmets 中抱怨我没有发布足够的代码,所以我试图包括这次可能相关的所有内容。
我的控制器中抛出此错误的方法是:
[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(); 线上。 entities 是我连接 SQL 数据库的 Context 类。
下面是对应的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; }
}
}
我创建了一个局部类来添加DataAnnotations,这里是:
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; }
}
}
我的project_clearance_id 被设置为我的表的主键,标识增量 = 1。
到目前为止我所做的尝试:
- 最初我的控制器正在生成具有预先计算的 ID 的新项目,所以显然我删除了它
- 我将所有 DataAnnotations 添加到该部分类的 ID 属性中
- 我以前在表单顶部有
Html.HiddenFor(model => model.project_clearance_id),但我删除了它 - 我将
[Bind(Exclude = "project_clearance_id")]添加到 POST 方法的参数中
似乎没有任何效果。如果有人看到任何我可以更改的内容,将不胜感激。
编辑:我进入模型的 .edmx 图表,右键单击 project_clearance_id,打开属性,并将 StoreGeneratedPattern 更改为 Identity。现在,当我尝试创建新条目时代码可以正常工作,但是当我尝试编辑现有条目时,它会创建一个包含修改后字段的新条目,并且原始条目仍然像以前一样存在。
【问题讨论】:
-
这是实体框架问题,不是 MVC 问题。
-
好的,我的帖子中还有什么需要补充的吗?这并不能真正回答我的问题。
-
我正在给你写一个答案,cmets 通常只是为了建议/询问更多信息/等等。我知道它没有回答你的问题
-
所以我再说一遍,我的帖子中还应该包含其他内容吗?
-
去掉视图代码,去掉asp.net、mvc、razor标签,添加实体框架标签。
标签: c# sql-server entity-framework