2016-10-28 43 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()'也返回调用栈,它显示了错误发生的位置。很多时候,这不是你认为的地方 –