如何在 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,您可以这样做:
- Make sure you have a collection of cities on the country.
- Expose CountryId as a FK on your City model and make it nullable.
- 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();
我有很多具有外键关系的表。例如国家和城市关系。当我删除国家时,我的应用程序崩溃了,因为我有外键关系。我想要的是,如果用户删除了国家/地区,它应该被删除并将 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,您可以这样做:
- Make sure you have a collection of cities on the country.
- Expose CountryId as a FK on your City model and make it nullable.
- 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();