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有方法叫做Entry和Entry<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)
| 归档时间: |
|
| 查看次数: |
18101 次 |
| 最近记录: |