在昨天发布的EntityFramework 7的RC1中,添加了Cascade Delete。
要根据关系禁用它,我可以使用:
builder.Entity<Site>().HasOne(e => e.Person)
.WithMany(x => x.Sites).Metadata.DeleteBehavior = DeleteBehavior.Restrict;
我想为DbContext全局禁用它,但我找不到方法。我该怎么办?
答案 0 :(得分:25)
有人在github项目论坛上说过,现在唯一的方法是遍历方法OnModelCreating(ModelBuilder builder)
中的所有关系,并将DeleteBehavior
属性设置为DeleteBehavior.Restrict
:
foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
答案 1 :(得分:11)
目前的约定不可配置。当前的CascadeDelete约定仅适用于required relationships。 efproject.net上的Relationships Conventions: Cascade Delete(官方EF7文档)如果您了解后果,可以明确禁用所需的关系。
modelBuilder.Entity<Site>()
.HasOne(p => p.Person)
.WithMany(b => b.Sites)
.IsRequired(false);
否则(和推荐),您需要明确设置On Delete行为(如您所发现的那样)。
modelBuilder.Entity<Site>()
.HasOne(p => p.Person)
.WithMany(b => b.Sites)
.OnDelete(DeleteBehavior.Restrict);
答案 2 :(得分:0)
如果您对模型类中的属性不使用Required
,则默认情况下会将其生成为DeleteBehavior.Restrict
。如果您要使用Required
,请使用DeleteBehavior.Cascade
。您可以通过使用with / without Required来生成虚拟迁移。