C# 实体框架多对多级联单向删除

C# 实体框架多对多级联单向删除,c#,entity-framework,C#,Entity Framework,我有两个实体:报告和文件请求。这两者之间存在多对多关系 所以Report.cs public virtual ICollection<FileRequest> FileRequests { get; set; } 公共虚拟ICollection文件请求{get;set;} 并且FileRequest.cs public ICollection<Report> Reports { get; set; } public ICollection报告{get;set;}

我有两个实体:报告和文件请求。这两者之间存在多对多关系

所以Report.cs

 public virtual ICollection<FileRequest> FileRequests { get; set; }
公共虚拟ICollection文件请求{get;set;}
并且FileRequest.cs

 public ICollection<Report> Reports { get; set; }
public ICollection报告{get;set;}
实体框架已经生成了一个联接表(FileRequestReports),级联删除始终适用于联接表条目。 我想做的是删除filerequest会删除关联的报告,但删除报告不会删除关联的filerequests。应始终删除关联的联接表项

注意:启用了ManyToManyCascadeDelete约定

使用EF和级联删除是否有相对简单的方法


提前感谢。

我认为实现这一点的唯一方法是创建一个类来表示多对多关系。像这样:

public class ReportFileRequest
{
    public int ReportId { get; set; }

    public int FileRequestId { get; set;}

    public virtual Report Report { get; set;}

    public virtual FileRequest FileRequest { get; set; }
}
您必须更新
报告

public virtual ICollection<ReportFileRequest> ReportFileRequests { get; set; }
映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ReportFileRequest>()
        .HasKey(i => new { i.ReportId, i.FileRequestId });

    model.Entity<ReportFileRequest>()
       .HasRequired(i => i.Report)
       .WithMany(i => i.ReportFileRequests)
       .WithForeignKey(i => i.ReportId)
       .WillCascadeOnDelete(true);

    model.Entity<ReportFileRequest>()
       .HasRequired(i => i.FileRequest)
       .WithMany(i => i.ReportFileRequests)
       .WithForeignKey(i => i.FileRequestId)
       .WillCascadeOnDelete(false);

}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasKey(i=>new{i.ReportId,i.FileRequestId});
model.Entity()
.has必需(i=>i.Report)
.WithMany(i=>i.ReportFileRequests)
.WithForeignKey(i=>i.ReportId)
.WillCascadeOnDelete(真);
model.Entity()
.HasRequired(i=>i.FileRequest)
.WithMany(i=>i.ReportFileRequests)
.WithForeignKey(i=>i.FileRequestId)
.WillCascadeOnDelete(假);
}

文件请求报告中是否有其他信息?通常,自动生成的多对多表使用两个相关表的ID作为键。如果删除关系的一端,则会将其设置为级联删除,因为外键约束将失败。为了实现这一点,您需要创建自己的
FileRequestReport
实体,给它一个唯一的键,将
ReportId
字段设为必填项,并将
FileRequestId
设为空。否,FileRequestReports只包含两个外键可能重复的
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ReportFileRequest>()
        .HasKey(i => new { i.ReportId, i.FileRequestId });

    model.Entity<ReportFileRequest>()
       .HasRequired(i => i.Report)
       .WithMany(i => i.ReportFileRequests)
       .WithForeignKey(i => i.ReportId)
       .WillCascadeOnDelete(true);

    model.Entity<ReportFileRequest>()
       .HasRequired(i => i.FileRequest)
       .WithMany(i => i.ReportFileRequests)
       .WithForeignKey(i => i.FileRequestId)
       .WillCascadeOnDelete(false);

}