Мне нравится отключать каскадное удаление по умолчанию (удаляя OneToManyCascadeDeleteConvention
)
Я тогда надеялся добавить их обратно через аннотации, но был удивлен, что EF не включает CascadeDeleteAttribute
.
Потратив слишком много времени на работу над нелепыми внутренними уровнями доступа EF, код в этой сущности добавляет соглашение, позволяющее использовать атрибуты: https://gist.github.com/tystol/20b07bd4e0043d43faff
Для использования просто придерживайтесь[CascadeDelete]
на обоих концах свойств навигации для отношения и добавьте соглашение в обратный вызов OnModeCreating вашего DbContext.Например:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Add<CascadeDeleteAttributeConvention>();
}
А в вашей модели:
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
[CascadeDelete]
public List<BlogPostComment> Comments { get; set; }
}