entity framework 删除与 EntityState.Deleted

entity framework Remove vs EntityState.Deleted

这两种说法有什么区别?

两者都应该删除一个实体。

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

对于那些不了解 EF 扩展的人:

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

那就更酷了:D

它们是一样的,但都会失败。 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 上下文中进行质量 updates/deletes。

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

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

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

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

警告:请确保不要在 EF 和 EF.Extended 中同时操作对象。这可能会导致不可预知的结果或异常。