我正在使用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();
}
答案 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();
其他方式可能是将实体的状态更改为Deleted
。DbContext
包含名为Entry
和Entry<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();