同时删除和更新数据库 MVC

Delete and Update database at the same time MVC

我想删除 table 中的所有记录,只要根据数据库中的某个 ID 存在超过 X 条记录即可。

        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 记录?因为我想一直保留 UserID 的 1 张图片。如果我只是截断它每次都会删除所有内容而且我不知道如何在这里使用 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
    }
}