Entity framework 如何使用EF 6.1.1从表中删除单个记录

Entity 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

我正在使用实体框架6.1.1。

我正在从表中删除一条记录,如下所示,但我不确定这是唯一的方法还是可以进一步高效地重写它

有人可以分享评论吗

原因:我之所以这么问,是因为之前文章中的许多解决方案都参考了EF 4.0,而没有使用最新版本6.1.1

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