实体框架事务期间与线程相关的多个错误

时间:2015-08-03 21:49:13

标签: c# entity-framework

当我对控制器进行POST时,我间歇地得到线程错误 - 尽管很多时候一切都会完美运行。这些是最常见的两个:

  

不允许使用新事务,因为会话中还有其他线程在运行。

     

无法执行事务操作,因为存在处理此事务的待处理请求。

我已阅读多篇回复,说明为何会发生这种情况。例如this onethis one,但我不能说我理解。我知道发布代码是非常糟糕的做法,而且我通常会尽力避免它,但我真的不知道该问什么过去“如果你看到任何明显的问题,请你看看并告诉我。 “

textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1.0f));

注意:我100%确定这与// POST: api/CheckOuts [AccessType(AccessType.Create)] [HttpPost, Route("")] [ResponseType(typeof(CheckOut))] public async Task<IHttpActionResult> PostCheckOut(TransactionViewModel<CheckOut> tx) { //check if tx is a valid CheckOut Model Object if (!ModelState.IsValid) { return BadRequest(ModelState); } tx.Transaction.OrganizationId = SelectedOrganizationID; tx.Transaction.OfficeId = SelectedOfficeID; tx.Transaction.CheckedOutById = UserId; tx.Transaction.Date = DateTime.UtcNow; var items = tx.Transaction.Items.ToList(); long checkedOutStatus = db.Statuses.First( a => a.Name == "Checked Out" ).Id; long checkedInStatus = db.Statuses.First( a => a.Name == "Checked In" ).Id; //check item status if( !items.TrueForAll( i=> i.StatusId == checkedInStatus ) ) { return BadRequest("Not all items are in 'Checked In' state."); } var mongoItems = GetMongoCollection<BsonDocument>(MongoConstants.ItemsCollection); items.ForEach(async item => { var builder = Builders<BsonDocument>.Update; var update = builder.Set("StatusId", checkedOutStatus) .Set("CustodianId", tx.Transaction.TakenById) .Set<BsonDocument, int?>("LocationId", null) .Set<BsonDocument, string>("Location", null); await mongoItems.FindOneAndUpdateAsync( Builders<BsonDocument>.Filter.Eq("_id", item.Id), update); await AddItemHistory(item, UserId); var primaryKeyOfTheItemId = db.ItemIds.Single(i => i.Item_Id == item.Id); tx.Transaction.ItemIds.Add(primaryKeyOfTheItemId); }); //add item db.CheckOuts.Add(tx.Transaction); await db.SaveChangesAsync(UserId); return CreatedAtRoute("DefaultApi", new {controller = "checkouts", id = tx.Transaction.Id }, tx.Transaction); } 有关,而且不是MongoDb特有的。下面的代码相当于使用EF将内容保存到SQL。我确信其他Mongo位与这个问题完全无关。

async

await mongoItems.FindOneAndUpdateAsync( Builders<BsonDocument>.Filter.Eq("_id", item.Id), update); 是我们的实体框架dbContext(只是与SQL一起使用的普通dbContext,我们有两个数据库--Mongo和SQL)。

1 个答案:

答案 0 :(得分:2)

我没有看到你在方法体中创建上下文。实体框架上下文不是线程安全的。