如何解决空数据库表上的乐观并发异常错误
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)。在这种情况下,需要确保将“数据库生成的”选项设置为“无”。
以上是关于如何解决空数据库表上的乐观并发异常错误的主要内容,如果未能解决你的问题,请参考以下文章