gpt4 book ai didi

c# - 为所有实体设置级联删除

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:48 25 4
gpt4 key购买 nike

我正在尝试为我的所有实体配置 DeleteBehavior。最终结果是我可以简单地运行:

DELETE FROM Companies Where Id = '1'

我所有的 800 个表都将在级联中被清理(所有表引用 CompanyId as FK)...

我的类(class)

public interface ITest
{
string PropX { get; set; }
Company Company { get; set; }
}

public abstract class Reg {
public int Id { get; set; }
public Company Company { get; set; }
}

public class Company {
public int Id { get; set; }
public string Name { get; set; }
}


public class Test : Reg, ITest
{
public string Prop1 { get; set; }
public string PropABC { get; set; }
public string PropX { get; set; } = "My Info";
}

public class Test2 : Reg, ITest
{
public string PropEFG { get; set; }
public string PropX { get; set; } = "My Info2";
}

public class Test3 : Reg, ITest
{
public string PropExample { get; set; }
public string PropX { get; set; } = "My Info3";
}

如果我这样做,效果完美:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Test>().HasOne(p=>p.Company).WithMany().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Test2>().HasOne(p=>p.Company).WithMany().OnDelete(DeleteBehavior.Cascade);
//....... not for 800 classes

}

但我有 800 个类(class)...所以我正在尝试这样做:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

var my800Entities = modelBuilder.Model.GetEntityTypes().ToList();

foreach (var entity in my800Entities)
{
modelBuilder.Entity(entity.Name).HasOne("Company").WithMany().OnDelete(DeleteBehavior.Cascade);
/* It seems to me that this code is creating an
extra column and not defining the already existing property */
}

}

上面的代码在每个类中生成一个多列的迁移,示例:

  • 其他属性...
  • 公司(FK限制删除行为)
  • Company1(具有 FK 级联删除行为)

对于具有级联删除行为的 1 列(公司),我需要做什么?

最佳答案

首先过滤实现接口(interface)的实体类型:

var my800Entities = modelBuilder.Model.GetEntityTypes()
.Where(t => typeof(ITest).IsAssignableFrom(t.ClrType))
.ToList();

然后(这是您代码的主要问题),将相关类型和导航属性名称都传递给 HasOne 方法(目前您只传递相关类型名称,相当于无参数泛型 HasOne 并指示关系没有导航属性,因此 EF Core 将另一个关系与该属性相关联):

foreach (var entity in my800Entities)
{
modelBuilder.Entity(entity.Name)
.HasOne(typeof(Company), "Company") // <--
.WithMany()
.OnDelete(DeleteBehavior.Cascade);
}

关于c# - 为所有实体设置级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com