2016-07-07 38 views
0

只要基於數據庫中的某個ID存在多於X條記錄,我想要刪除表中的所有記錄。同時刪除並更新數據庫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添加一個集合只接受一個對象,不用於集合/ *對不起,因爲錯誤*/...... 這裏我提到了一些條目狀態爲已刪除,之後我添加了一些(一)entriy(s)。然後我要求EF保存所有更改,意味着當代碼行「db.SaveChanges()」執行時,整個過程將被執行(包括刪除和創建) –

2

不能使用截斷據我知道爲了這個目的。你可以做如下的事情。

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

這將離開了最後一個記錄(通過ID),也將比truncate表現不佳,因爲這將是交易記錄。

+0

謝謝你的回答,但我不認爲它對我的案例有太大的幫助,但是做一些研究,我從你的建議中學到了很多東西。我將用解決方案編輯響應。 – Eduard

相關問題