我正在使用Entity Framework 6.0.1 Code-First
方法,我正在努力从数据库中删除我的对象。
我已为Delete on Cascade
关系设置true
规则为0..1-N
:
HasRequired(i => i.OneEntity).WithMany(v => v.ManyEntities).
WillCascadeOnDelete(true);
现在,在我的删除方法中,我执行以下操作:
对于1-N
关系,我从上下文中删除了相对对象:
//OneEntity is an entity that contains a list of referenced entities
//of another type.
RootEntity.OneEntity.ManyEntities.ForEach(be => ctx.OtherElements.Remove(be));
对于0..1-1
关系,我从对象列表中删除元素,如果是可选的(根据需要,EF约定指定自动应用级联(older question)):
//One entity is a reference to another entity of another type of
//RootEntity.
ctx.OneEntities.Remove(RootEntity.OneEntity);
对于N-N
关系,我清理对象列表:
//No context removal operation here.
RootEntity.ManyToManyEntities.Clear();
现在,虽然这有效,但我觉得我做错了事,或者在最佳处理方面采用不必要的操作。
我对重构的第一个想法是:
1)从1-N关系中删除任何上下文删除代码,因为级联可能会起作用。
2)在可选的1-1关系上应用级联。
3)删除N-N关系的任何清单许可,因为这应该自动完成。
我应该继续这些想法,还是整个代码可以进行这种处理?是否有更好的替代策略去除对象?我的缺点是级联可能会导致不必要的副作用,这取决于数据库使用的支持。
答案 0 :(得分:1)
如果您在数据库中配置了正确的关系,则级联删除将自动发生 - sql将自行完成。因此,子实体将在那之后不在那里,如果您尝试使用其他请求,则无需删除任何内容。
我首先使用EF 6'代码'并且定义了正确的关系,并且我只使用了一次父删除 - 其他所有内容都会自动删除。父子关系的规则是在数据库模式中构建的,SQL服务器完成了这项工作,我们可以认为这是安全的。