【问题标题】:how delete more than one record from database using Linq in asp.net mvc如何在asp.net mvc中使用Linq从数据库中删除多条记录
【发布时间】:2014-12-26 13:29:23
【问题描述】:

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

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();

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

【问题讨论】:

  • ...导致错误...一些细节怎么样
  • 请在新标签页中打开图片,以便您轻松阅读我的错误,谢谢

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


【解决方案1】:

要通过 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 命令

【讨论】:

  • 我之前遇到的同样的问题
【解决方案2】:

来自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);

【讨论】:

  • 正确。但问题中没有给出版本限制。
  • @YasirAslam 你确定它是 EF4.5 还是 .Net Framework 4.5?我在 MS 列表中没有看到那个版本的 EF (msdn.microsoft.com/en-us/data/jj574253.aspx)。
  • 对不起,我的版本是 5.0,我是 asp.net 的新手。请检查我的帖子,我用我的错误截图更新。
【解决方案3】:
dbContext.Database.ExecuteSqlCommand("delete from VehicleProperties where EngineId = {0}", id);

这是唯一节省时间的方法...Check Answer Here

【讨论】:

    【解决方案4】:

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

    DELETE 语句与 REFERENCE 冲突

    解决方案 我只是去那个 SQL Server 管理工作室打开外键并设置删除规则:级联 (在 INSERT 和 UPDATE 规范中)

    【讨论】:

      【解决方案5】:

      您可以执行以下操作:

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

      【讨论】:

      • Delete() 没有这样的方法
      【解决方案6】:

      请求信息后更新:

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

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

      有关如何使用 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

      关闭这两个标志有利有弊。在我的情况下,它的服务更好(巨大的性能节省)然后是坏的。是否有任何副作用(最近一个月没有看到)。

      【讨论】:

      • 不是单一的答案是工作 mu 记录少于不超过 15
      • @YasirAslam - 检查异常对话框中的 innerException。我认为可能存在约束问题。您可以在帖子中添加您的 VehicleProperties 实体吗?
      • 这是异常:{"DELETE 语句与 REFERENCE 约束 \"FK_VehicleEngine_VehicleModel\" 冲突。冲突发生在数据库 \"rapid\",表 \"dbo.VehicleEngine\",列 ' ModelId'。\r\n语句已终止。"}
      【解决方案7】:

      当你想删除一行时,使用 .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(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 2018-10-14
        • 2018-04-18
        • 2016-06-16
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        相关资源
        最近更新 更多