C# 循环或多个级联路径多对多关系

C# 循环或多个级联路径多对多关系,c#,entity-framework,many-to-many,C#,Entity Framework,Many To Many,我有课程销售,产品和场合。销售必须指单个产品,该产品可能有多个销售场合。客户可能只想在某些情况下购买产品。在我创建了产品和购买之间的一对多关系之后,我还想在销售和场合之间创建一个多对多关系,以跟踪销售项目中包括哪些场合。这些是课程 public class Sale { [ForeignKey("ProductId")] public Product Product { get; set; } public int ProductId { get; set;

我有课程销售,产品和场合。销售必须指单个产品,该产品可能有多个销售场合。客户可能只想在某些情况下购买产品。在我创建了产品和购买之间的一对多关系之后,我还想在销售和场合之间创建一个多对多关系,以跟踪销售项目中包括哪些场合。这些是课程

public class Sale
{      
    [ForeignKey("ProductId")]
    public Product Product { get; set; }
    public int ProductId { get; set; }

    public Sale()
    {
        Occasions = new List<Occasion>(); 
    }
    public virtual ICollection<Occasion> Occasions { get; set; }
}
 public class Occasion
{           
    [ForeignKey("ProductId")]
    public Product Product { get; set; }
    public int ProductId { get; set; }

    public virtual ICollection<Sale> Sales{ get; set; }
}
public class Product
{
    public virtual ICollection<Occasion> Occasions { get; set; }
}
公共类销售
{      
[外键(“产品ID”)]
公共产品产品{get;set;}
public int ProductId{get;set;}
公开发售()
{
场合=新列表();
}
公共虚拟ICollection{get;set;}
}
公开课场合
{           
[外键(“产品ID”)]
公共产品产品{get;set;}
public int ProductId{get;set;}
公共虚拟ICollection销售{get;set;}
}
公共类产品
{
公共虚拟ICollection{get;set;}
}
通过以下代码创建多对多关系

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Sale>().
            HasMany(p => p.Occasions).
            WithMany(o => o.Sale).
            Map(
            m =>
            {
                m.MapLeftKey("SaleId");
                m.MapRightKey("OccasionId");
                m.ToTable("SaleOccasions");
            });
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()。
有很多(p=>p。
WithMany(o=>o.Sale)。
地图(
m=>
{
m、 MapLeftKey(“SaleId”);
m、 MapRightKey(“OccasionId”);
m、 ToTable(“销售机会”);
});
}
更新数据库会返回错误

在表“SaleOccasions”上引入外键约束“FK_dbo.SaleOccasions_dbo.Exceptions_OccasionId”可能会导致循环或多个级联路径

如果我从迁移中删除
cascadeDelete:true
,我可以创建联接表并创建新条目,但是当我在删除对销售的引用后尝试删除销售时(
sale.events.Remove(evence)
,对于与销售相关的所有场合),将抛出

DELETE语句与引用约束冲突

我想到了一个解决办法,完全放弃Sale和Exceptions之间的EF关系,而是在Sale中创建一个字符串属性,将场合id的列表更改为单个字符串,但我觉得这不是一个好的解决方案。有更好的解决办法吗