实体框架:如何在单向相关实体上启用级联删除

Rez*_*aei 6 c# entity-framework code-first

有两个实体,如贝娄:

public class Business
{
    public int Id {get; set;}

    public File Logo {get; set;}
    public int? LogoId {get; set;}

    public File Video {get; set;}
    public int? Video {get; set;}

    public ICollection<File> Images {get; set;}
}

public class File
{
    // some file props, such as Id, Name, ...
}
Run Code Online (Sandbox Code Playgroud)

如何在业务删除时为文件配置级联删除?请考虑,我不需要任何导航从FileBusiness.

更新:

您可以在下面找到modelBuilder配置:

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

        modelBuilder.Entity<Entities.Business>()
            .HasOptional(b => b.Logo)
            .WithOptionalPrincipal()
            .WillCascadeOnDelete();

        modelBuilder.Entity<Entities.Business>()
            .HasOptional(b => b.Video)
            .WithOptionalPrincipal()
            .WillCascadeOnDelete();

        modelBuilder.Entity<Entities.Business>()
            .HasMany(b => b.Images)
            .WithOptional()
            .WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

在表'Files'上引入FOREIGN KEY约束'FK_dbo.Files_dbo.Businesses_Business_Id1'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束

das*_*dot 5

如果你想使用单独的配置类,你可以尝试这样的事情:

  public class BusinessConfiguration : EntityTypeConfiguration<Business>
  {
        public BusinessConfiguration()
        {
            HasMany(x => x.Images).WithOptional().WillCascadeOnDelete();
            HasOptional(x => x.Logo).WithOptional().WillCascadeOnDelete();
            HasOptional(x => x.Video).WithOptional().WillCascadeOnDelete();
        }
  }
Run Code Online (Sandbox Code Playgroud)

当你没有传递lambda .WithOptional().WithRequired()意味着另一边没有导航属性.