我如何使用Entity Framework从表中删除单条记录?我在Entity Framework中有一个名为
employ
的SQL Server表, 其中只有一个名为ID
的关键列。employ
的SQL Server表, 其中只有一个名为ID
的关键列。不必先查询对象,您可以通过其id将其附加到上下文中。就像这样:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
或者,您可以将附加条目的状态设置为已删除:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
。 - Simon BelangerSingleOrDefault
获取与您的条件匹配的单个对象,然后将其传递给EF表的Remove
方法。var itemToRemove = Context.Employ.SingleOrDefault(x => x.id == 1); //returns a single item.
if (itemToRemove != null) {
Context.Employ.Remove(itemToRemove);
Context.SaveChanges();
}
var stud = (from s1 in entities.Students
where s1.ID== student.ID
select s1).SingleOrDefault();
//Delete it from memory
entities.DeleteObject(stud);
//Save to database
entities.SaveChanges();
FirstOrDefault
很危险。如果你确定只有一个值,应该使用 SingleOrDefault
;如果有多个值,则应该使用循环来处理。 - Mark Sowul我正在使用Entity Framework和LINQ。以下代码对我很有帮助;
1- 对于多条记录
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- 单条记录
using (var dbContext = new Chat_ServerEntities())
{
var singleRec = dbContext.ChatUserConnections.FirstOrDefault( x => x.ID ==1);// object your want to delete
dbContext.ChatUserConnections.Remove(singleRec);
dbContext.SaveChanges();
}
SingleOrDefault
而使用 FirstOrDefault
? - Mark SowulEmployer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
Single
),要么有多个,应该在循环中完成。 - Mark Sowulpublic virtual void Delete<T>(int id) where T : BaseEntity, new()
{
T instance = Activator.CreateInstance<T>();
instance.Id = id;
if (dbContext.Entry<T>(entity).State == EntityState.Detached)
{
dbContext.Set<T>().Attach(entity);
}
dbContext.Set<T>().Remove(entity);
}
我想贡献一下我反复斟酌过的三种方法。
方法1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
方法二:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
我更喜欢使用方法2的原因之一是,如果将EF或EFCore设置为QueryTrackingBehavior.NoTracking
,这样做更加安全。
然后还有方法3:
var record = ctx.Records.FirstOrDefault();
var entry = ctx.Entry(record);
record.DeletedOn = DateTimeOffset.Now;
entry.State = EntityState.Modified;
ctx.SaveChanges();
entry.State = EntityState.Detached;
DeletedOn
属性来实现,并且仍然能够保留该记录以备将来使用,不管将来可能是什么情况。基本上就像是把它放进了回收站。entry.State = EntityState.Modified;
DeletedOn
设置为已修改:entry.Property(x => x.DeletedOn).IsModified = true;
使用Entity Framework 6,您可以使用Remove
方法。此外,使用using
语句是一种好的策略,以确保您的连接被关闭。
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
[HttpPost]
public JsonResult DeleteCotnact(int id)
{
using (MycasedbEntities dbde = new MycasedbEntities())
{
Contact rowcontact = (from c in dbde.Contact
where c.Id == id
select c).FirstOrDefault();
dbde.Contact.Remove(rowcontact);
dbde.SaveChanges();
return Json(id);
}
}
你觉得这个简单吗?你也可以试试这个:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();