我有很多表有外键关系。如国家和城市的关系。当我删除国家/地区时,我的应用程序正在崩溃,因为我有外键关系。我想要的是,如果用户删除了国家/地区,它应该被删除并将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,你可以这样做:
- 确保您在该国拥有一系列城市。
- 在城市模型上将 CountryId 公开为 FK,并使其可为空。
- 将它们设置为 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();