这两个陈述之间的区别是什么?
两者都应删除实体。
_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
答案 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中同时操作对象。这可能导致不可预测的结果或例外。