如何解决空数据库表上的乐观并发异常错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决空数据库表上的乐观并发异常错误相关的知识,希望对你有一定的参考价值。

使用ASP.NET MVC,实体框架在SQL Server数据库上执行CRUD操作。我正在将新信息插入连接的表中。我有许多用于执行此操作的表,但以前从未遇到过此错误。

当我将数据提交给控制器时,它将遍历典型的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()不起作用?再次感谢您的帮助。

答案

[检查是否在数据库中具有在数据库中自动生成的值的所有列在您的实体配置中标记为Identity表示关键列,Computed表示其他所有列。 DateTime值可能与SQL类型和毫秒有关,因此请检查它们是否为DateTime2(7)可能会有帮助。根据表的结构,插入可能会导致Insert + Update,这可能会触发并发异常,该异常仅应在Updates或Deletes中发生,而不应在Inserts中发生。当EF遇到默认列时,如果未将它配置为解决此问题,则可能会将其混淆为并发更新。

有关与DateTime相关的插入问题的详细信息,请参见(DbUpdateConcurrencyException on insert)。在这种情况下,需要确保将“数据库生成的”选项设置为“无”。

以上是关于如何解决空数据库表上的乐观并发异常错误的主要内容,如果未能解决你的问题,请参考以下文章

rootView上的Android片段空指针异常[关闭]

操作栏上不确定的进度条上的空指针异常

数据库表上的列名无效

java高并发,如何解决,啥方式解决,高并发

片段中的 Listview 适配器给出空指针异常

Mybatis如何传递多个参数——一个莫名空指针错误引起的思考