如何在asp.net mvc中使用Linq从数据库中删除多条记录

时间:2014-10-30 13:21:40

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4

这是删除一条记录的代码:

var vehicleProperty = db.VehicleProperties.Where(a => a.EngineId == id).ToList();
db.VehicleProperties.Remove(vehicleProperty);
db.SaveChanges();

如果我想删除多个项目,那么我将会执行的操作,例如,删除所有where typeId = 4

我正在尝试使用下面的代码,但会导致错误。

var vp = db.VehicleProperties.Where(a => a.EngineId == id).ToList();
db.VehicleProperties.Remove(vp);
db.SaveChanges();

我正在使用实体框架Version = 5.0.0.0并使用EF Designer表单数据库(实体数据模型) 我尝试了很多代码,但错误请检查我的截图与代码和错误

error try with RemoveRange error 2 errro 3 EF Designer form database

7 个答案:

答案 0 :(得分:8)

要通过Linq to Entities执行此操作,您需要遍历集合,一次删除一个

var vps = db.VehicleProperties.Where(a => a.EngineId == id).ToList();
foreach (var vp in vps)
    db.VehicleProperties.Remove(vp);
db.SaveChanges();

或者,您可以按照this MSDN article

传入SQL命令

答案 1 :(得分:4)

来自the related article

var vp = db.VehicleProperties.Where(a => a.EngineId == id);
db.VehicleProperties.RemoveRange(vp);
db.SaveChanges();

db.Database.ExecuteSqlCommand("delete from VehicleProperties where EngineId = {0}", 4);

答案 2 :(得分:1)

dbContext.Database.ExecuteSqlCommand("delete from VehicleProperties where EngineId = {0}", id);

这是唯一一次省时的方式...... Check Answer Here

答案 3 :(得分:1)

我的问题是由于外键检查我的第二张图片显示异常。首先删除孩子然后删除父母

DELETE语句与REFERENCE

冲突

<强>解决方案 我只是去那个SQL Server Managment studio打开外键并设置Delete Rule:Cascade (在INSERT和UPDATE Spcification中)

答案 4 :(得分:0)

您可以执行以下操作:

db.VehicleProperties.Where(a => a.EngineId == id).ToList().ForEach(db.tblA.DeleteObject);
db.SaveChanges();

答案 5 :(得分:0)

请求信息后更新:

根据我们的内部异常细节,很明显存在外键约束冲突。

这意味着,在删除在其他表中作为外键引用的键之前,必须先删除相关行。您还可以删除导致错误的约束,以使行依赖于键。

有关如何使用EF实现该目标的更多信息是here


如果要删除的项目数量不是很大,您可以使用Andy Nichols建议的内容。

但是当你想要删除数百和数千个项目时,你会注意到该方法不具备性能。我最近遇到过一个这样的案例,并将我的方法改为以下所示:

    public void DeleteAll<T>(IEnumerable<T> items) where T : class
    {
        Guard.ArgumentNotNull(items, "items");

        var autoDetectChangesEnabledBefore = Configuration.AutoDetectChangesEnabled;
        var validateOnSaveEnabled = Configuration.ValidateOnSaveEnabled;

        // It is said to make the performance better.
        Configuration.AutoDetectChangesEnabled = false;
        Configuration.ValidateOnSaveEnabled = false;

        foreach (var item in items)
        {
            Set<T>().Attach(item);
            Set<T>().Remove(item);
        }

        SaveChanges();

        Configuration.AutoDetectChangesEnabled = autoDetectChangesEnabledBefore;
        Configuration.ValidateOnSaveEnabled = validateOnSaveEnabled;

    }

您可以阅读这些标志here

关闭这两个标志有利有弊。在我的情况下,它提供更好的(巨大的性能节省)然后坏。如果有任何副作用(在过去一个月内没有看到任何副作用),请公开征求意见。

答案 6 :(得分:0)

如果要删除一个ROW,请使用.First()OR FirstOrDefault()

var x = (from obj in db.Vehiclepropertie where obj.Engineid == id select obj).First();

db.VehicleProperties.Remove(x);

db.SaveChanges();

注意: - 您也可以使用.ToList()或FirstOrDefault而不是First()。

如果您希望在ID基础上删除多于一行

var x = (from obj in db.Vehiclepropertie where obj.Engineid == id select obj).ToList();

db.Vehiclepropertie.RemoveRange(x); 

db.SaveChanges();