MVC - 当IDENTITY_INSERT设置为OFF时,无法在表中插入标识列的显式值

时间:2017-07-12 16:14:14

标签: c# sql-server entity-framework

为我的模型提交创建表单时,出现错误:

 rte_mbuf *myJumboMbuf = m_pPoolMgr->getJPktPool()->getMBuf();
 for (rte_mbuf *m = (rte_mbuf*)mbuf; m != NULL; m = mbuf_api_next(m))
 {
     uint16_t u16DataLen = mbuf_api_get_data_len(m);
     char* buffer = rte_pktmbuf_append(myJmboMbuf, u16DataLen);
     if (!buffer)
     {
         mbuf_free(myJmboMbuf);
         ret = ERR_NO_MEM;
     }
     rte_memcpy(buffer, get_data_from_mbuf(m, void*), u16DataLen);
 }

我可以看到这个问题已经被问了很多但是我对代码做了很多改动而没有运气。我很抱歉这是如此多的代码,我通常会在评论中抱怨我没有发布足够的代码,所以我试图包含这次可能相关的所有内容。

我的控制器中抛出此错误的方法是:

(new SomeClass()).someMethod();

{"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" }); } 是我用于连接SQL数据库的Context类。

这是相应的GET方法:

entities.SaveChanges();

我的模型是DBmodel。这是该模型中的违规财产:

entities

我创建了一个部分类来添加DataAnnotations,它位于:

[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);
}

我的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; } } } 被设置为我的表的主键,其身份增量= 1。

我已经尝试过什么

  • 最初我的控制器正在生成具有预先计算ID的新项目,所以显然我删除了
  • 我将所有DataAnnotations添加到该分部类
  • 中的ID属性中
  • 我以前在表单的顶部有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添加到POST方法的参数

似乎没有任何效果。如果有人看到任何我可以改变的东西,那将是值得赞赏的。

编辑:我进入了我的模型的.edmx图表,右键点击了Html.HiddenFor(model => model.project_clearance_id),打开了属性,并将[Bind(Exclude = "project_clearance_id")]更改为project_clearance_id。现在代码在我尝试创建新条目时工作正常,但是当我尝试编辑现有条目时,它会创建一个带有修改字段的新条目,并且原始条目仍然存在,就像之前一样。

1 个答案:

答案 0 :(得分:1)

您的问题是您正在尝试插入/更新数据库记录,并且在生成的SQL中,您将映射到t_bcim_project_clearance列的字段设置为特定值,但是因为您已设置此值为了一个身份你不允许这样做,因为它的值是自动设置的。

您需要确保映射到此列的对象中的值未被修改或标记为已修改。

而不是使用entities.Entry(project).State = EntityState.Modified,设置每个属性实际上处于修改状态,而不是修改对象本身。要将属性设置为已修改,您可以执行以下操作:

db.Entry(project).Property(x => x.PropertyName).IsModified = true;

执行.Add()时,请确保将属性project_clearance_id的值设置为0。

编辑每条评论的其他信息:

  • 如果您将其删除,请务必在视图中加入Html.HiddenFor(model => model.project_clearance_id)。如果您正在执行更新,则需要这样做。
  • 从参数中删除[Bind(Exclude = "project_clearance_id")]属性,因为如果您正在执行更新,则需要此值。