这是删除一条记录的代码:
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表单数据库(实体数据模型) 我尝试了很多代码,但错误请检查我的截图与代码和错误
答案 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)
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();