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

imm*_*rza 14 entity-framework code-first ef-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();
}
Run Code Online (Sandbox Code Playgroud)

oct*_*ccl 32

如何在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();
Run Code Online (Sandbox Code Playgroud)

删除而不从数据库加载

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

var toDelete = new StudentReportDetail {Id = 2 };

context.StudentReportDetail.Attach(toDelete);
context.StudentReportDetail.Remove(toDelete);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

其他方式可能是将实体的状态更改为Deleted.DbContext有方法叫做EntryEntry<TEntity>,这些方法获得了DbEntityEntry对于给定的实体,并提供访问关于实体的信息,并返回一个DbEntityEntry能够对实体执行的操作对象.现在,您只需将实体状态更改为EntityState.Deleted:即可对上下文执行删除操作:

var toDelete = new StudentReportDetail {Id = 2 };
context.Entry(toDelete).State = EntityState.Deleted;  
context.SaveChanges();  
Run Code Online (Sandbox Code Playgroud)

使用第三方库

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

context.StudentReportDetail
    .Where(u => u.Id== stuDetails)
    .Delete();
Run Code Online (Sandbox Code Playgroud)