2016-07-07 47 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

相关问题