2016-10-28 3 views
0

У меня есть работа Azure, которая асинхронно сохраняет записи в базе данных. Я нахожу, что он фактически ничего не сохраняет в базе данных. Я определенно использую async/ждет везде. Я добавляю родительские (рыночные) и дочерние записи. Моя база данных имеет референтные ограничения, поэтому родитель должен существовать перед дочерним элементом, но это должно быть хорошо, поскольку я делаю их в правильном порядке. У меня нет попыток уловить мои методы, и в лазурных журналах ничего нет, поэтому кажется, что работа преуспевает. Я вызвал Method1 с ожиданием от Winforms exe, и он отлично работает. Что может быть неправильным?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, как правило, необработанные ошибки времени выполнения отображаются на выходном веб-задании для экземпляра, который он запускал, который вы можете видеть на портале Azure. –

+1

Не следует предполагать, что среда будет регистрировать любые необработанные исключения. Вы должны использовать правильную обработку исключений и протоколирование и регистрировать исключение * whole *, а не только 'ex.Message'. 'Exception.ToString()' возвращает стек вызовов, а также показывает, где именно произошла ошибка. Много раз, это не то место, где вы думали, что это –