2017-01-17 5 views
0

Я размещаю .Net Web Api на лазурном, api просто обновляет одну строку в базе данных сервера sql. Вот мой Updatecode:Azure Entityframework SaveChanges Very Slow

using (Storage ctx = new Storage()) 
     { 
      string json = JsonConvert.SerializeObject(ev, _jsonsettings); 
      Data ex = ctx.dbsData.FirstOrDefault(); 
      if (ex == null) 
       ctx.dbsData.Add(new Data() { Json = json, LastUpdate = DateTime.Now }); 
      else 
      { 
       ex.Json = json; 
       ex.LastUpdate = DateTime.Now; 
       ctx.Entry(ex).State = EntityState.Modified; 
      } 
      ctx.SaveChanges(); 
      return new HttpResponseMessage(HttpStatusCode.OK); 
     } 

и у меня есть второй метод, который только очищает таблицу:

[HttpDelete] 
    public HttpResponseMessage Clear() 
    { 
     using (Storage ctx = new Storage()) 
     { 
      ctx.dbsData.RemoveRange(ctx.dbsData); 
      ctx.SaveChanges(); 
      return new HttpResponseMessage(HttpStatusCode.OK); 
     } 
    } 

Смотрите также мой DbContext Класс:

public class Storage : DbContext 
{ 
    public DbSet<Data> dbsData { get; set; } 

    public Storage(string connectionstring) : base(connectionstring) 
    { 
     Configuration.LazyLoadingEnabled = false; 
     Configuration.ProxyCreationEnabled = false; 
     Configuration.ValidateOnSaveEnabled = false; 
     Configuration.AutoDetectChangesEnabled = false; 
    } 

    public Storage() : this("tom") 
    { 

    } 
} 

Моя проблема в том, что оба методы чрезвычайно медленны. Я обнаружил, что если я удалю команду SaveChanges(), она выполняется быстрее. Поэтому мой вопрос заключается в том, как я могу повысить производительность и почему это так долго, чтобы обновлять/удалять одну строку?

+0

Причина, по которой это происходит быстрее, когда вы удаляете SaveChanges(), потому что без нее ваш db не обновляется. SaveChanges() - это точка, в которой запрос действительно выполняется в вашей базе данных. для одной строки это не должно быть медленным. Однако нужна ли больше информации, насколько велики данные json, которые вы сохранили в одном из столбцов? это сэкономит в конце концов или это просто время? – MartinM

+0

Я знаю, что savechanges() обновляет базу данных. Я не понимаю, почему он медленный (~ 10 секунд). Мой json имеет размер около 500 кб. Если я попробую его локально на моем сервере sqlexpress, он будет храниться незамедлительно без каких-либо задержек. –

+0

Не могли бы вы предоставить более подробную информацию о том, что Azure вы используете? Является ли это службой VM или App с Azure SQL Database? Когда вы пытаетесь локально, вы имеете в виду, что вы устанавливаете строку подключения Azure WebApi к локальному sqlexpress? Вы пытались установить свою локальную строку соединения в базу данных Azure SQL? –

ответ

-2

Это полностью зависит от того, сколько данных находится в вашей таблице ctx.dbsData. ctx.dbsData.RemoveRange (ctx.dbsData); отмечает только эти строки для удаления. Но изменения будут отражаться только после вызова SaveChanges(); Для более быстрой обработки вы можете использовать асинхронные вызовы.

+0

Будьте осторожны, говоря: «Для более быстрой обработки вы можете иметь асинхронные вызовы». Хотя использование асинхронных вызовов может дать большую производительность в целом, заявление в изоляции не соответствует действительности. здесь http://stackoverflow.com/a/30043327/692830 - хороший ответ, сравнивающий разницу с SaveChanges и SaveChangeAsync. То, что вы говорите, будет лучше служить комментарием, оно не дает ответа на вопрос, просто еще вопросы – MartinM

+0

В таблице всегда есть только одна строка –

+0

@ManuelBleimuth, тогда это не займет столько времени. Мне нужно увидеть ваш код. – Pavvy