如何在 M-V-C 代码优先方法中一次在父删除时指定 null 到外键



我有很多表有外键关系。如国家和城市的关系。当我删除国家/地区时,我的应用程序正在崩溃,因为我有外键关系。我想要的是,如果用户删除了国家/地区,它应该被删除并将forrign键设置为null。以下是我在OnModelCreate方法中的代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Player>().HasOptional(r => r.Team)
        .WithMany(a => a.Players)
        .HasForeignKey(b => new { b.TeamId })
        .WillCascadeOnDelete(false);
    base.OnModelCreating(modelBuilder);
}

这里的问题是我有 20 到 25 张桌子,我不想手动完成。是否有任何代码会自动为整个应用程序设置级联假?

是的

,您可以在 Code First 中删除一对多和/或多对多约定的级联删除。只需将其中一个或两个添加到您的 OnModelCreation 中:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

这将禁用它,但您可以根据需要使用 .WillCascadeOnDelete(true) 重新打开级联删除。看这里和这里。

编辑:如果你的问题是关于将集合的FK设置为null,你可以这样做:

  1. 确保您在该国拥有一系列城市。
  2. 在城市模型上将 CountryId 公开为 FK,并使其可为空。
  3. 将它们设置为 null 并删除国家/地区。
var countryToDelete =  context.Country.Include(c => c.Cities).FirstOrDefault(c => c.CountryId == countryIdToDelete;
countryToDelete.Cities.ForEach(c => c.CountryId = null);
context.Country.Remove(countryToDelete);
context.SaveChanges();

最新更新