2016-07-07 2 views
0

Я хочу удалить все записи в таблице, если существует больше, чем X записей на основе некоторого ID в базе данных.Удалять и обновлять базу данных одновременно MVC

 using(ApplicationDbContext app = new ApplicationDbContext()) 
     {    
      try 
      { 
       var UserImg = app.Images.Where(x => x.UserID == LoggedUserId).Select(s => s.ID).FirstOrDefault(); 

       if (UserImg != null) 
       { 
        app.Database.ExecuteSqlCommand("TRUNCATE TABLE [Image] LIMIT 2");     
       } 
       else if(UserImg == null) 
       { 
        app.Images.Add(img); 
       } 

       app.SaveChanges(); 

       return RedirectToAction("Details", "Jobs", new { controller = "JobsController", action = "Details", id = Session["DetailsURL"] }); 

      } 

      catch (DbEntityValidationException ex) 
      { 
       //non-relevant stuff 
      } 
     } 

Более точно на ExecuteSqlCommand, как мне удается держать X записи? Потому что я хочу постоянно сохранять 1 изображение на UserID. Если я просто усекаю, он будет удалять каждый раз все, и я не знаю, как использовать LIMIT здесь.

В принципе, я хочу обновить текущее изображение с новым, если есть другой подход, я чувствую себя более открытым, чтобы попробовать.

Solution:

  try 
      {     

       foreach (var id in app.Images.Where(x => x.UserID == LoggedUserId).Select(e => e.ID)) 
       { 
        var entity = new Image { ID = id }; 
        app.Images.Attach(entity); 
        app.Images.Remove(entity); 
       } 

       app.Images.Add(img); 
       app.SaveChanges(); 

       return RedirectToAction("Details", "Jobs", new { controller = "JobsController", action = "Details", id = Session["DetailsURL"] }); 

      } 

ответ

1

@Eduard попробовать это

я думаю, что это ваш ответ

он удалит все существующие данные, за исключением последнего, и вставить новый один

это чисто EF и быстрее, чем SubQuerys

using(ApplicationDbContext db = new ApplicationDbContext()) 
{    
    try 
    { 
     //collect all images except final one 
     var existImgRows = db.Images.Where(x => x.ID == UserID).OrderByDescending(x => x.ID).Skip(1).Select(x=>x); 

     if(existImgRows != null) 
     { 
      foreach (var item in existImgRows) 
      { 
       db.Entry(item).State = System.Data.Entity.EntityState.Deleted; 
      } 
     } 
     db.Entry(img).State = System.Data.Entity.EntityState.Added; 
     db.SaveChanges(); 
    } 
    catch (DbEntityValidationException ex) 
    { 
     //non-relevant stuff 
    } 
} 
+0

Здравствуйте, я получаю эту ошибку: Тип объекта DbQuery'1 не является частью модели для текущего контекста. где вы пытаетесь удалить с EntityState. Однако я давно редактировал свой вопрос с решением. Спасибо за ваше время и силы. – Eduard

+1

@Eduard Я отредактировал его с некоторым foreach. эта ошибка из-за добавления коллекции в 'db.Entry()' db.Entry принимает только один объект, не работает с коллекцией/* Извините за ошибку */...... Здесь я упомянул, что некоторые записи записываются как удаленные, и после этого я добавил некоторые (одни) адреса (ов). то я попросил EF сохранить все изменения, означая, что весь процесс будет выполнен (как удаление, так и создание), когда выполняется строка кода «db.SaveChanges()» –

2

Вы не можете использовать усечение, насколько я знаю, для этой цели. вы можете сделать что-то вроде следующего.

DELETE FROM [image] 
WHERE [id] IN (SELECT [id] 
       FROM [image] 
       WHERE id < (SELECT Max(id) 
          FROM [image])) 

Это оставило бы из последней записи (по идентификатору), а также будет выполнять плохо, чем truncate, поскольку это будет сделка регистрируется.

+0

Благодарим вас за ответ, но я не думаю, что его помощь слишком много в моем случае, но, проводя некоторые исследования, я многому научился из вашего предложения. Я отредактирую ответ с помощью решения. – Eduard