2016-10-28 79 views
0

我有一個Azure作業,它將記錄異步保存到數據庫。我發現它實際上並沒有將任何內容保存到數據庫中。我絕對使用異步/等待處處。我正在添加家長(市場)和兒童記錄。我的數據庫有參照約束,所以父母必須在孩子面前存在,但這應該沒問題,因爲我按照正確的順序進行。我沒有嘗試抓住我的方法,並且azure日誌中沒有任何內容,因此看起來作業成功了。我已經從Winforms exe中調用了Method1,並且從中可以正常工作。什麼可能是錯誤的?SaveChangesAsync無法在Azure webjob中工作

public static async Task MyJob([TimerTrigger("00:02:00", RunOnStartup = true)] TimerInfo timerInfo, TextWriter log) 
    { 
     await Jobs.Method1(Client, Logger); 
    } 


    public static async Task Method1(IClient client, ILogger logger) 
    { 
    await DataRepository.AddMarket(event.Id, event.MarketId); 
     await DataRepository.AddMarketChild(event.MarketId, 999); 
    } 


    public static async Task<Market> AddMarket(string eventId, string marketId) 
    { 
     using (var ctx = BTBEntities.CreateContext()) 
     { 
      var market = new Market() 
      { 
       MarketId = marketId, 
       EventId = eventId, 
      }; 
      ctx.Markets.Add(market); 
      await ctx.SaveChangesAsync(); 
      return market; 
     } 
    } 

    public static async Task<HorseBet> AddHorseBet(string marketId, long selectionId) 
    { 
     using (var ctx = BTBEntities.CreateContext()) 
     { 
      var bet = new MarketChild() 
      { 
       MarketId = marketId, 
       SelectionId = selectionId, 
      }; 
      ctx.MarketChilds.Add(bet); 
      await ctx.SaveChangesAsync(); 
      return bet; 
     } 
    } 

回答

0

結果發現有一個數據庫問題,它正在被Azure吞噬。這是我如何修復它。

public override System.Threading.Tasks.Task<int> SaveChangesAsync() 
    { 
     try 
     { 
      return base.SaveChangesAsync(); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      var errorMessages = ex.EntityValidationErrors 
      .SelectMany(x => x.ValidationErrors) 
      .Select(x => x.ErrorMessage); 
      var fullErrorMessage = string.Join("; ", errorMessages); 
      var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);     
      throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); 
     } 
    } 
+0

如果沒有錯誤處理和記錄,你不能說有東西被吞噬。你期望看到錯誤的地方在哪裏? –

+0

@Panagiotis Kanavos通常未處理的運行時錯誤出現在它運行的實例的Web作業輸出中,您可以在Azure門戶中看到 –

+1

您不應該認爲環境會記錄任何未處理的異常。您應該使用適當的異常處理和日誌記錄,並記錄*整個*異常,而不僅僅是'ex.Message'。 'Exception.ToString()'也返回調用棧,它顯示了錯誤發生的位置。很多時候,這不是你認爲的地方 –