如何使用 EF 6.1.1 从 table 中删除单个记录

How do i delete single record from table using EF 6.1.1

我正在使用 Entity Framework 6.1.1.

deleting single record from table如下,但我不确定这是唯一的方法还是可以进一步以有效的方式重写它。

有人可以分享评论吗?

原因:我问是因为早期帖子中的许多解决方案都引用了 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 之间如何删除实体没有变化。要使用 Entity Framework 删除实体,您需要在 DbSet 上使用 Remove 方法. 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();

删除而不从数据库加载

如果您需要删除一个实体,但它不在内存中,那么从数据库中检索该实体只是为了删除它的效率有点低。如果知道要删除的实体的key,可以附上一个代表要删除的实体的stub,然后删除这个stub. stub 是仅分配了键值的实体实例。 键值是删除实体所需的全部

var toDelete = new StudentReportDetail {Id = 2 };

context.StudentReportDetail.Attach(toDelete);
context.StudentReportDetail.Remove(toDelete);
context.SaveChanges();

其他方法可能是将实体的状态更改为 DeletedDbContext 具有称为 EntryEntry<TEntity> 的方法,这些方法获得 DbEntityEntry给定的实体,并提供对有关实体的信息的访问,以及 return 一个能够对实体执行操作的 DbEntityEntry 对象。现在您只需将实体状态更改为 EntityState.Deleted:

即可对上下文执行删除操作
var toDelete = new StudentReportDetail {Id = 2 };
context.Entry(toDelete).State = EntityState.Deleted;  
context.SaveChanges();  

使用第 3 方库

还有另一种方法,但是使用第 3 方库 EntityFramework Plus,您可以安装一个 nugget 包。您可以使用批量删除操作:

context.StudentReportDetail
    .Where(u => u.Id== stuDetails)
    .Delete();