【问题标题】:EF Core | Unable to create a pivot table utilising the same modelEF 核心 |无法使用相同模型创建数据透视表
【发布时间】:2021-11-18 20:33:04
【问题描述】:

我有一个数据透视表设置,我为两列使用相同的模型,为可以相互引用的列创建几乎“白名单”。

export class Service {
  public int Id { get; set; }

  public string Name { get; set;
}
export class ServiceWhitelist {
  public int Id { get; set; }

  public int ServiceId { get; set; }

  public int TargetServiceId { get; set; }

  public Service Service { get; set; }

  public Service TargetService { get; set; }
}

然后我尝试在父服务模型中设置关系...

public ICollection<ServiceWhitelist> ServiceWhitelist { get; set }

但这样做后,我可以做到以下几点:

无法确定导航'Service.ServiceWhitelist'所代表的关系

所以我在 DbContext 中添加了以下内容,但仍然抛出错误:

builder.Entity<Service>().HasMany(s => s.ServiceWhitelist).WithOne(sw => sw.Service);

但它似乎不起作用。我是不是在接近这个错误,因为有没有更好的方法来完成这种功能?

【问题讨论】:

    标签: .net entity-framework


    【解决方案1】:

    由于 ServiceWhitelist 中有两个外键,因此您必须将导航属性与所需的外键相关联。并且最多其中一个可以级联删除(至少在 SQL Server 中)。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Service>()
                    .HasMany(s => s.ServiceWhitelists)
                    .WithOne(s => s.Service)
                    .OnDelete(DeleteBehavior.Cascade);
    
        modelBuilder.Entity<ServiceWhitelist>()
                    .HasOne(sw => sw.TargetService)
                    .WithMany()
                    .HasForeignKey(sw => sw.TargetServiceId)
                    .OnDelete(DeleteBehavior.Restrict);
    
        base.OnModelCreating(modelBuilder);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-14
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多