C# 无法在表中插入标识列的显式值<;实体>;当IDENTITY_INSERT设置为OFF时。

C# 无法在表中插入标识列的显式值<;实体>;当IDENTITY_INSERT设置为OFF时。,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我已经阅读了stack overflow推荐给我的每一篇文章,但还没有解决我的问题。这是我的第一篇文章,如果这是一个简单的修复,我道歉,但不管我先保存什么(后冷器、F1046或BasicInfo,我在显式插入后冷器的标识时遇到异常。BasicInfo自己保存很好,但在添加F1046、保存它或添加后冷器并保存它时,我遇到此异常。后冷器和F1046应为1对1,F1046和BasicInfo应为一对多关系 实体: [MetadataType(typeof(F1046MetaDataSource))]

我已经阅读了stack overflow推荐给我的每一篇文章,但还没有解决我的问题。这是我的第一篇文章,如果这是一个简单的修复,我道歉,但不管我先保存什么(后冷器、F1046或BasicInfo,我在显式插入后冷器的标识时遇到异常。BasicInfo自己保存很好,但在添加F1046、保存它或添加后冷器并保存它时,我遇到此异常。后冷器和F1046应为1对1,F1046和BasicInfo应为一对多关系

实体:

[MetadataType(typeof(F1046MetaDataSource))]
public partial class F1046
{
    public int F1046Id { get; set; }      
    public virtual AfterCooler AfterCooler { get; set; }

    public int BasicInfoId { get; set; }
    public virtual BasicInfo BasicInfo { get; set; }
}

class F1046MetaDataSource
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int F1046Id { get; set; }

    [ForeignKey("BasicInfo")]
    public int BasicInfoId { get; set; }
}

[MetadataType(typeof(AfterCoolerMetaDataSource))]
public partial class AfterCooler : IComparer<AfterCooler>
{

    public string AfCoolReasonChange { get; set; }
    public string VendorAF { get; set; }

    public int F1046Id { get; set; }
    public virtual F1046 F1046 { get; set; }  
}

class AfterCoolerMetaDataSource
{
    [Key,ForeignKey("F1046")]
    public int F1046Id { get; set; }
}


[MetadataType(typeof(BasicInfoMetaDataSource))]
public partial class BasicInfo
{
    public int BasicInfoId { get; set; }
    public DateTime? DateBasicInfo { get; set; }
    ...
    public virtual ICollection<F1046> F1046 { get; set; }

    public BasicInfo()
    {
        F1046 = new List<F1046>();
    }

}

class BasicInfoMetaDataSource
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BasicInfoId { get; set; }
}
(基本上每个实体看起来都一样,只是交换了上下文/id…)

我有一个视图,其中包含基本信息(但不是id)和F1046(但不是id)的元素,F1046的成员(后冷器、其属性等)如下:

<div class="form-group">
                    @Html.Label("After Cooler Reason")
                    @Html.EditorFor(x => Model.F1046.AfterCooler.AfCoolReasonChange, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => Model.F1046.AfterCooler.AfCoolReasonChange, "", new { @class = "text-danger" })
  </div>
我已经尝试了每一个顺序,或者至少感觉是这样的。如果这没有多大意义,我很抱歉,这个程序需要很多字段,我试图忽略不相关的字段。上面提到的控制器方法的ViewModel包含一个BasicInfo对象和一个F1046对象。
谢谢。

“F1046”…我甚至不想继续阅读。不过,说真的,请在调用之前查看对象。添加并确保对象的Id为null/negative我为命名约定道歉,但后冷器的pk/fk为0,但我应该采取什么步骤使其成为所需的值?(null或其父Id)?
<div class="form-group">
                    @Html.Label("After Cooler Reason")
                    @Html.EditorFor(x => Model.F1046.AfterCooler.AfCoolReasonChange, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => Model.F1046.AfterCooler.AfCoolReasonChange, "", new { @class = "text-danger" })
  </div>
[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult CreateF1046(F1046_CreateViewModel fm)
    {
        if (ModelState.IsValid)
        {
            BasicInfo bi = fm.BasicInfo;
            F1046 f1 = fm.F1046;
            _f1046Repository.SaveF10461(f1);
            bi.F1046.Add(f1);

            return RedirectToAction("Summary", bi);

        }