我有课程销售,产品和场合。销售必须涉及单个产品,并且产品可能有多个场合。客户可能只想购买产品的某些场合。在我在产品和购买之间创建一对多之后,我还想在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的列表更改为单个字符串,但我觉得这不是一个好的解决方案。更好的解决方案?