Как устранить ошибку исключений оптимистичного параллелизма на пустой таблице БД - PullRequest
0 голосов
/ 01 ноября 2019

Использование ASP.NET MVC, Entity Framework для выполнения операций CRUD в базе данных SQL Server. Я вставляю новую информацию в связанные таблицы. У меня есть множество таблиц, над которыми я делаю эту операцию, но я никогда раньше не сталкивался с этой ошибкой.

Когда я отправляю свои данные в контроллер I, они проходят через типичные данные EFF. Однако, когда он попадает в мою строку db.SaveChanges(), я получаю эту ошибку оптимистичного исключения параллелизма, ссылаясь на то, что данные могли измениться из базы данных. В этой конкретной ситуации в таблице нет данных, поэтому для меня это не имеет смысла.

Я последовал рекомендации и прочитал кое-что об этом. Реализовано одно из их исправлений, но оно не работает. Не работает, потому что ищет GetDatabaseValues(), а их нет. Я пропустил что-то глупое здесь? Я просто беру значения формы и вставляю их в две разные таблицы, которые я настроил.

Вот контроллер:

[HttpPost]
public ActionResult SubmitUwSelections(FormCollection form)
{
        var cbRating = form["cabRating"]; // Cab Raing ddl
        var filing = form["fileRqd"]; // filing required ddl
        var ifta = form["cbIfta"]; // IFTA cb
        var lossControl = form["lcRqd"]; // Loss control cb
        var app1 = form["AppInFile"]; //Application app in file cb
        var app2 = form["AppRqd"]; //Application app rqd cb
        var um1 = form["UMInFile"]; //UM in file cb
        var um2 = form["UMRqd"]; // UM rqd cb
        var terror1 = form["terrorInFile"]; // terror in file cb
        var terror2 = form["terrorRqd"]; // terror rqd cb
        var lossRun1 = form["LossRunInFile"];// loss run in file cb
        var lossRun2 = form["LossRunRqd"]; //Loss run rqd cb
        var inspect1 = form["cbVehicleInspectInFile"]; //vehicle inspect in file cb
        var inspect2 = form["cbVehicleInspectRqd"]; // vehicle inspect rqd cb
        var mvr1 = form["cbMvrInFile"]; // mvr in file cb
        var mvr2 = form["cbMvrRqd"]; // mvr rqd cb
        var psComments = form["cifComments"]; //section 2 comment box
        var uniqPolicy = form["UniqPolicy"];
        string c = uniqPolicy.ToString();
        int u = Convert.ToInt32(c);

        // need to form up and create variables for the segmentation part of the insert. 
        // Segmentation pieces. 
        var segYear = form["segYear"]; //seg tab segmentation year
        var tractors = form["tractors"]; //seg tab tractors
        var truck = form["trucks"]; //seg tab trucks
        var su = form["serviceUnits"]; //seg tab service units
        var estMileage = form["estAnnMile"]; // segmentation tab Est-Annual Mileage
        var estRvenue = form["estAnnRev"]; //seg tab est annual revenue
        var radius = form["radius"]; // seg tab radius ddl
        var primaryOp = form["primaryOperation"]; //Seg tab primary operation ddl

        int l, m, n, o, p = 0;
        l = Convert.ToInt32(segYear); //Converts seg year into int
        m = Convert.ToInt32(tractors); //converts seg tractors to int
        n = Convert.ToInt32(truck); //converts seg trucks to int
        o = Convert.ToInt32(su); //converts seg service units to int
        p = Convert.ToInt32(estMileage); //converts seg est ann mileage to int
        decimal revenue = Convert.ToDecimal(estRvenue); //converts seg est revenue to decimal

        using (TruckingDb db  = new TruckingDb())
        {
            // Create dto to insert Form collection items 
            CIF_Record_InsertDTO dto = db.CIF_Record.Find(u); //checking to see if row exists
            CIF_Record_InsertDTO dtoSend = new CIF_Record_InsertDTO();
            CIF_Segmentation_InsertDTO segDto = new CIF_Segmentation_InsertDTO();

            if (dto == null)
            {
                // create UniqPolicy dto
                dtoSend.UniqPolicyId = u;

                // Create user insert dto. 
                string user = Request.LogonUserIdentity.Name.Substring(Request.LogonUserIdentity.Name.LastIndexOf(@"\") + 1);
                dtoSend.Underwriter = user;

                // set the cif record comments section. 
                dtoSend.Comments = psComments;

                // Set the UwSegmentation value
                dtoSend.UwSegmentationSubmit = true;

                // Set segmentation dto's
                segDto.SegmentationYear = l;
                segDto.Tractors = m;
                segDto.Trucks = n;
                segDto.ServiceUnits = o;
                segDto.EstAnnualMileage = p;
                segDto.EstAnnualRevenue = revenue;
                segDto.Radius = radius;
                segDto.PrimaryOperation = primaryOp;

                // 1. inserting dto's into two different tables
                db.CIF_Record.Add(dtoSend);  
                db.CIF_Segmentation.Add(segDto); //2.
            }
            else
            {
                // temporarily empty
            }

            bool saveFailed;

            do
            {
                saveFailed = false;

                try
                {
                    db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    saveFailed = true;

                    //update original values from the db
                    var entry = ex.Entries.Single();
                    entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                }
            } while (saveFailed);
        }

        return RedirectToAction("CompleteCIF");
}    

do while чуть выше первого исправления, но он не работает. Хит поймать и нажать entry.GetDatabaseValues(), но, конечно, нет никаких значений OG для начала. Почему saveChanges() не работает? Спасибо еще раз за помощь.

1 Ответ

1 голос
/ 01 ноября 2019

Убедитесь, что все столбцы, для которых автоматически сгенерированы значения в базе данных, помечены в конфигурации вашей сущности как Identity для ключевых столбцов и Computed для всего остального. Значения DateTime могут иметь проблемы с типом SQL и миллисекундами, поэтому проверьте, что они DateTime2 (7) может помочь. В зависимости от структуры таблицы, вставка может привести к вставке + обновлению, что может вызвать исключение параллелизма, которое должно происходить только при обновлении или удалении, а не при вставке. Когда EF встречает столбец по умолчанию, он может спутать это с одновременным обновлением, если он не настроен для учета этого.

См. ( DbUpdateConcurrencyException при вставке ) для получения подробной информации о проблемах вставки, связанных с DateTime. В их случае необходимо было убедиться, что для параметров «Сгенерировано БД» для них задано значение «Нет».

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