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

时间:2015-07-28 09:53:23

标签: entity-framework ef-code-first code-first

我正在使用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();
}

1 个答案:

答案 0 :(得分:31)

如何在EF 4和EF 6之间删除实体没有任何变化。要使用Entity Framework删除实体,您需要在Remove上使用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();

删除而不从数据库加载

如果你需要删除一个实体,但它还没有在内存中,那么从数据库中检索该实体只是为了删除它是有点低效的。如果您知道要删除的实体的密钥,则可以附加表示要删除的实体的存根,然后删除此存根存根是仅具有指定键值的实体的实例。 键值是删除实体所需的全部内容

var toDelete = new StudentReportDetail {Id = 2 };

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

其他方式可能是将实体的状态更改为DeletedDbContext包含名为EntryEntry<TEntity>的方法,这些方法为给定的DbEntityEntry实体并提供对实体信息的访问,并返回能够对实体执行操作的DbEntityEntry对象。现在,您只需将实体状态更改为EntityState.Deleted

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

使用第三方库

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

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