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

时间:2015-09-03 13:22:54

标签: c# entity-framework many-to-many

我有课程销售,产品和场合。销售必须涉及单个产品,并且产品可能有多个场合。客户可能只想购买产品的某些场合。在我在产品和购买之间创建一对多之后,我还想在Sales和Occasions之间创建多对多关系,以跟踪Sales项目中包含的场合。这是课程

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; }
}

通过以下代码创建多对多关系

 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");
            });
    }

并更新数据库将返回错误

  

在表'SaleeOccasions'上引入FOREIGN KEY约束'FK_dbo.SaleeOccasions_dbo.Occasions_OccasionId'可能会导致循环或多个级联路径。 。 。

如果我从迁移中删除cascadeDelete: true,我可以创建连接表并创建新条目,但是当我尝试删除对时机的引用(sale.Occasions.Remove(occasion)之后删除销售时与销售相关的场合)会抛出

  

DELETE语句与REFERENCE约束冲突..

我想通过完全放弃Sale和Occasions之间的EF关系来解决这个问题,而是在Sale中创建一个String属性,将Occasion id的列表更改为单个字符串,但我觉得这不是一个好的解决方案。更好的解决方案?

0 个答案:

没有答案