Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC-当identity\U insert设置为OFF时,无法在表中插入identity列的显式值_C#_Sql Server_Entity Framework - Fatal编程技术网

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; }
    }
}
My
project\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”)]
    属性,因为在执行更新时需要此值

这是一个实体框架问题,而不是MVC问题。好的,那么我的帖子中还需要包括其他内容吗?这并没有真正回答我的问题。我给你写了一个答案,评论通常只是为了建议/询问更多信息/等等。我知道它不能回答你的问题,所以我重复一下,我的帖子中还有其他内容吗?删除视图代码,删除asp.net、mvc,和razor标记并添加实体框架标记。
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)
重新添加到我的表单中,现在它可以很好地用于创建和编辑。