2017-04-23 22 views
1

我在我的應用程序中有這個功能。如果短語插入失敗,那麼是否有人可以告訴我審覈條目是否仍然被添加?如果是這種情況,那麼是否有辦法將這些數據打包成可以回滾的單個事務。如果saveChangesAsync中的多個添加中的一個添加失敗,其他添加?

此外,如果它失敗了,我可以捕獲這個,然後仍然有程序退出,例外?

[Route("Post")] 
    [ValidateModel] 
    public async Task<IHttpActionResult> Post([FromBody]Phrase phrase) 
    { 

     phrase.StatusId = (int)EStatus.Saved; 
     UpdateHepburn(phrase); 
     db.Phrases.Add(phrase); 
     var audit = new Audit() 
     { 
      Entity = (int)EEntity.Phrase, 
      Action = (int)EAudit.Insert, 
      Note = phrase.English, 
      UserId = userId, 
      Date = DateTime.UtcNow, 
      Id = phrase.PhraseId 
     }; 
     db.Audits.Add(audit); 
     await db.SaveChangesAsync(); 
     return Ok(phrase); 
    } 

回答

2

我在我的應用程序中有這個功能。如果插入短語失敗 那麼是否有人可以告訴我審覈條目是否仍然被添加?

您已經通過調用await db.SaveChangesAsync();只是一個時間做對DbContext所有的修改後,寫你的代碼以正確的方式。

您的問題的答案是:不,如果Phrase失敗,則不會添加Audit。 由於您在對實體做所有事情之後調用await db.SaveChangesAsync();,實體框架將生成所有必需的SQL查詢並將它們放入單個SQL事務中,從而使整個查詢成爲數據庫的原子操作。如果其中一個生成的查詢例如Audit生成的查詢失敗,那麼事務將被回滾。因此,對數據庫所做的每個修改都將被刪除,因此Entity Framework將使您的數據庫處於一致狀態。