Entity framework 如何使用EF 6.1.1从表中删除单个记录
我正在使用实体框架6.1.1。 我正在从表中删除一条记录,如下所示,但我不确定这是唯一的方法还是可以进一步高效地重写它 有人可以分享评论吗 原因:我之所以这么问,是因为之前文章中的许多解决方案都参考了EF 4.0,而没有使用最新版本6.1.1Entity framework 如何使用EF 6.1.1从表中删除单个记录,entity-framework,ef-code-first,code-first,Entity Framework,Ef Code First,Code First,我正在使用实体框架6.1.1。 我正在从表中删除一条记录,如下所示,但我不确定这是唯一的方法还是可以进一步高效地重写它 有人可以分享评论吗 原因:我之所以这么问,是因为之前文章中的许多解决方案都参考了EF 4.0,而没有使用最新版本6.1.1 Guid studentId = student.Id; StudentReportDetail stuDetails = _context.StudentReportDetail.Find(studentId); if (stuDetails != nu
Guid studentId = student.Id;
StudentReportDetail stuDetails = _context.StudentReportDetail.Find(studentId);
if (stuDetails != null)
{
_context.StudentReportDetail.Remove(stuDetails);
_context.SaveChanges();
}
关于如何删除EF 4和EF 6之间的实体,没有任何更改。要使用实体框架删除实体,需要使用
DbSet
上的Remove
方法<代码>删除适用于现有实体和新添加的实体
- 对已添加但尚未保存的实体调用
添加到数据库将取消添加实体。该实体是 已从更改跟踪器中删除,并且不再由Remove
DbContext
- 对正在跟踪更改的现有实体调用
将在下次执行Remove
时注册实体以进行删除 打电话来SaveChanges
Id
,可以执行如下所示的查询以首先查找它:
var report= (from d in context.StudentReportDetail
where d.ReportName == "Report"
select d).Single();
context.StudentReportDetail.Remove(report);
context.SaveChanges();
在不从数据库加载的情况下删除
如果您需要删除一个实体,但它不在内存中,那么从数据库中检索该实体只是为了删除它会有点低效。如果知道要删除的实体的密钥,可以附加表示要删除的实体的存根,然后删除此存根。存根是只分配了键值的实体的实例。键值是删除实体所需的全部内容
另一种方法是将实体的状态更改为Deleted
DbContext
的方法称为Entry
和Entry
,这些方法获取给定实体的DbEntityEntry
,提供对该实体信息的访问,并返回一个能够对该实体执行操作的DbEntityEntry
对象。现在,只需将实体状态更改为EntityState,即可对上下文执行删除操作。已删除:
var toDelete = new StudentReportDetail {Id = 2 };
context.Entry(toDelete).State = EntityState.Deleted;
context.SaveChanges();
使用第三方库
还有另一种方法,但使用第三方库时,可以安装nugget软件包。您可以使用批删除操作:
context.StudentReportDetail
.Where(u => u.Id== stuDetails)
.Delete();
谢谢你的解释。“modelBuilder.Entity().HasOptional(x=>x.dependent).WithOptionalDependent().WillCascadeOnDelete()在上下文初始化类中”怎么样。。哪一个更好?你对我发布的问题的上述解释非常好,并使我的概念非常清晰。我正在确认我上述评论中关于“1-1关系的级联删除”的另一点。我认为这是执行级联删除的一个很好的解决方案。对于正常删除,您的回答非常好,我对此非常清楚。关于级联删除的实践,您会怎么说?这里唯一的问题是,如果数据库中不存在具有给定id的实体,则会引发异常。有办法吗?否则,我需要事先执行context.Any(x=>x.Id=Id)之类的操作,这将破坏此操作的目标。@DanO'Leary,我添加了另一种方法来完成此操作,它看起来很棒,尽管现在有人反对它:
context.StudentReportDetail
.Where(u => u.Id== stuDetails)
.Delete();