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

How can I specify null to foreign keys on parent delete at once in M-V-C Code first approach?

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

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 个表,我不想手动完成。是否有任何代码会自动为整个应用程序设置 cascade false?

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

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

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

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

  1. Make sure you have a collection of cities on the country.
  2. Expose CountryId as a FK on your City model and make it nullable.
  3. Set them to null and delete the country.
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();