EF继续抛出错误System.InvalidOperationException ASP.NET MVC

时间:2018-12-15 22:33:52

标签: c# sql asp.net-mvc entity-framework linq

我需要通过for循环插入父记录,并且需要根据新生成的ID创建子记录,但是EF似乎无法正常工作。

基于不同stackoverflow问题中建议的答案,我在所有db.savechanges()循环之后都调用foreach,但这只是创建两个记录,而foreach循环包含6个项目。

例外:

  

System.InvalidOperationException:'已成功提交对数据库的更改,但是在更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:违反了参照完整性约束:关系一端的'new_job.job_id'的属性值与另一端的'job_address_point.job_id'的属性值不匹配。

     

InvalidOperationException:发生了引用完整性约束冲突:关系一端的'new_job.job_id'的属性值与另一端的'job_address_point.job_id'的属性值不匹配。

代码:

foreach (var cartype in cartypes)
{
    if (cartype.TotalCar != 0)
    {
        for (int i = 0; i < cartype.TotalCar; i++)
        {
            //new_job job = new new_job();
            //new_job_db object same as new_job where I'm assigning all values to properties 
            //received in parameter

            new_job job = new_job_db.CloneJson();

            job.job_ref = str + createRandomNumber();
            job.car_type_id = cartype.CarTypeId;
            db.new_job.Add(job);
            db.SaveChanges();
            var jobId = job.job_id;
            var jobDate = job.job_date;
            //multi address
            foreach (SelectedPoint p in _newjobdto.addresses)
            {
                job_address_point addr = new job_address_point();
                addr.job_id = jobId;
                addr.passenger_id = passengerId;
                addr.job_date = jobDate;
                addr.point_seq = Convert.ToInt32(p.PointSeq);
                addr.place_id = p.PlaceId;
                addr.formatted_address = p.FormattedAddress;
                addr.lat = p.Lat;
                addr.lng = p.Lng;
                addr.post_code = p.PostCode;
                addr.zone_name = p.ZoneName;
                addr.mile = p.Miles;
                addr.km = p.Kms;
                addr.charges = p.Charges;
                db.job_address_point.Add(addr);    
            }
            db.SaveChanges();
        }
    }
}

更新:

这是调试结果: 在第1轮产生ID 然后在第二轮抛出异常:

第一轮: enter image description here

第二轮: enter image description here

车型: enter image description here

更新:

作为对Gabriel Luci答案的评论,我从此question实现了CloneJson()扩展方法,但它给出了相同的错误。我想处理foreach循环外的20个属性,并将其复制到foreach循环内的新创建的对象中,只需设置两个属性即可。

1 个答案:

答案 0 :(得分:0)

第一:

new_job job = new new_job();
//new_job_db object same as new_job where I'm assigning all values to properties 
//received in parameter
job = new_job_db;

对此有一些可疑的事情:

  1. 第二行覆盖第一行。要么将其设置为new new_job(),要么将其设置为new_job_db,但不能两者都设置。
  2. 什么是new_job_db?如果这是一条已保存到数据库中的记录,则可能是导致异常的原因,但是我不能不看声明的方式就说不清。

下一步:

db.Entry(job).State = System.Data.Entity.EntityState.Added;
db.new_job.Add(job);

请勿设置State。不用了将其添加到db.new_job集合中将为您做到这一点。这也可能是导致异常的原因。