实体框架Remove vs EntityState.Deleted

时间:2015-03-07 08:13:48

标签: entity-framework entity-framework-6.1

这两个陈述之间的区别是什么?

两者都应删除实体。

 _context.Entry(new Schoolyear { Id = schoolyearId }).State = EntityState.Deleted;
 _context.Schoolyears.Remove(new Schoolyear { Id = schoolyearId });

以及那些不了解EF Extensions的人:

 _context.Schoolyears.Delete(s => s.Id == schoolyearId);

这更酷:D

1 个答案:

答案 0 :(得分:11)

它们是相同的,但两者都会失败。 EF内部使用ObjectManager来跟踪EF使用的所有元素。使用EF的检索功能或使用_context.Schoolyears.Add(obj)向EF添加新条目来添加ObjectManager的条目。

引用未存储在对象管理器中的条目通常会创建InvalidOperationException个例外。以下行为类似:

Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Schoolyears.Remove(year);
_context.SaveChanges();

Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Entry(year).State = EntityState.Deleted;
_context.SaveChanges();

但是EF在第一种方法中会做更多的检查和状态变更活动。

如果可能的话,我总是更喜欢第一个方法。

在游戏的另一边EntityFramework.Extended。该库允许在EF上下文中进行批量更新/删除。

此库不使用ObjectManager,因此您可以使用

 _context.Schoolyears.Delete(s => s.Id == schoolyearId);

提示:您也可以使用(首选)

 _context.Schoolyears.Where(s => s.Id == schoolyearId).Delete();

警告:请确保您不要在EF和EF.Extended中同时操作对象。这可能导致不可预测的结果或例外。