同时删除和更新数据库 MVC


只要数据库中存在

超过 X 条基于某个 ID 的记录,我想删除表中的所有记录。

        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"] });
            }

据我所知,您不能为此目的使用截断。 您可以执行以下操作。

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

这将省略最后一条记录(按 id),并且性能也比truncate差,因为它将被记录事务。

@Eduard试试这个

我想这是你的答案

它将删除除最后一个数据之外的所有现有数据并插入一个新数据

这是纯 EF,比子查询更快

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
    }
}

相关内容

  • 没有找到相关文章

最新更新