Asp.net mvc 在M-V-C代码优先的方法中,如何在父项一次删除时将null指定给外键?

Asp.net mvc 在M-V-C代码优先的方法中,如何在父项一次删除时将null指定给外键?,asp.net-mvc,ef-code-first,cascading-deletes,Asp.net Mvc,Ef Code First,Cascading Deletes,我有很多表都有外键关系。如国家与城市的关系。当我删除国家/地区时,我的应用程序会崩溃,因为我有外键关系。我想要的是,如果用户删除国家,它应该被删除,并将forrign keys设置为null。以下是我在OnModelCreating方法中的代码: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Player>().HasOptional(r =

我有很多表都有外键关系。如国家与城市的关系。当我删除国家/地区时,我的应用程序会崩溃,因为我有外键关系。我想要的是,如果用户删除国家,它应该被删除,并将forrign keys设置为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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(r=>r.Team)
.有很多(a=>a.玩家)
.HasForeignKey(b=>new{b.TeamId})
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}

这里的问题是我有20到25个表,我不想手动操作。是否有任何代码会自动为整个应用程序设置cascade false?

是的,您可以先删除代码中一对多和/或多对多约定的cascade delete。只需将其中一个或两个添加到OnModelCreating:

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

我认为这是不可能的……你可以把孩子从父母那里带走,而不是从网站上带走。除非您将city表上的外键设置为null,并在删除Country时执行将其设置为null的逻辑,否则您为什么要这样做?然后你会有没有国家的城市。@JB06这只是一张桌子,我有其他的大桌子。@ElmerDantas很棒。如何将它们设置为空?意味着如果我删除英国,那么城市应该是国家Id为空的。我需要一个逻辑,这将适用于所有的表没有必要做一个接一个。有吗?我现在唯一能想到的是:在你的delete方法中,你得到你要删除的国家的城市列表,并将每个城市的值设置为null,然后删除这个国家。除此之外,我没有其他想法。我尝试了此操作,但它仍然会破坏应用程序。错误:
{“DELETE语句与引用约束“FK_dbo.Cities_dbo.Countries_CountryId”冲突。冲突发生在数据库“db1\”、表“dbo.Cities\”、列“CountryId”中。\r\n该语句已终止。}
确定。让我试试。我的国家/地区表与20个表链接,所以我需要从所有表中设置空值吗?不起作用<代码>一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
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();