我需要通过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 然后在第二轮抛出异常:
更新:
作为对Gabriel Luci答案的评论,我从此question实现了CloneJson()扩展方法,但它给出了相同的错误。我想处理foreach循环外的20个属性,并将其复制到foreach循环内的新创建的对象中,只需设置两个属性即可。
答案 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;
对此有一些可疑的事情:
new new_job()
,要么将其设置为new_job_db
,但不能两者都设置。new_job_db
?如果这是一条已保存到数据库中的记录,则可能是导致异常的原因,但是我不能不看声明的方式就说不清。下一步:
db.Entry(job).State = System.Data.Entity.EntityState.Added;
db.new_job.Add(job);
请勿设置State
。不用了将其添加到db.new_job
集合中将为您做到这一点。这也可能是导致异常的原因。