EF продолжает выдавать ошибку System.InvalidOperationException ASP.NET MVC - PullRequest
0 голосов
/ 16 декабря 2018

Мне нужно вставить родительскую запись в цикл for и на основе вновь сгенерированного идентификатора нужно создать дочерние записи, но 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, а во 2-м раунде бросаетисключение:

1-й раунд: enter image description here

2-й раунд: enter image description here

типы карт: enter image description here

Обновление:

В качестве комментария к ответу Габриэля Люси я реализовал метод расширения CloneJson () из этого вопроса , но он выдает ту же ошибку.Я хочу взять обработку 20 свойств вне цикла foreach и скопировать его во вновь создаваемый объект внутри цикла foreach, где нужно установить только два свойства.

1 Ответ

0 голосов
/ 16 декабря 2018

Первый:

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 сделает это за вас.Это также может быть причиной исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...