我正在尝试使用实体框架和流畅的API构建多对多的关系,但我不得不尝试允许重复的条目。这就是我所拥有的:
public class Pizza
{
public int PizzaId { get; set; }
public virtual ICollection<Topping> Toppings { get; set; }
}
public class Topping
{
public int ToppingId { get; set; }
}
所以在OnModelCreating()
我打电话:
modelBuilder.Entity<Pizza>()
.HasMany(p => p.Toppings)
.WithMany()
.Map(m => m.ToTable("ToppingsForPizza"));
这给了我一个很好的多对多关系,但问题是我希望披萨能够拥有相同顶部的多个实例,例如双意大利辣味香肠
生成的ToppingsForPizza
数据库无法支持...我猜是因为需要一个唯一的主键。
有办法做到这一点吗?
编辑:我的实际问题与披萨无关,这只是我提出的例子。
答案 0 :(得分:2)
您需要为多对多关系添加不同的主键。这意味着它成为了一个独立的实体
public class PizzaTopping
{
public int PizzaToppingId { get; set; }
public int PizzaId { get; set; }
public int ToppingId { get; set; }
public virtual Pizza Pizza { get; set; }
public virtual Topping Topping { get; set; }
}
public class Pizza
{
public int PizzaId { get; set; }
public virtual ICollection<PizzaTopping> PizzaToppings { get; set; }
}
public class Topping
{
public int ToppingId { get; set; }
public virtual ICollection<PizzaTopping> PizzaToppings { get; set; }
}
适用于Pizzas和Toppings没有多大意义.....; - )
答案 1 :(得分:0)
我认为你应该考虑将双辣椒作为单独的Topping。但是,您也可以创建第三个类,如下所示:
public class PizzaTopping
{
public int PizzaId { get; set; }
public int ToppingId { get; set; }
public int ToppingCount { get; set; }
public virtual ICollection<Pizza> Pizzas { get; set; }
public virtual ICollection<Topping> Toppings { get; set; }
}
public class Pizza
{
public int PizzaId { get; set; }
}
public class Topping
{
public int ToppingId { get; set; }
}
答案 2 :(得分:0)
另一种可能的解决方案是首先关闭代码并进行模型验证,按照其他人的描述创建新的主键,在PizzaId和ToppingId的关系表中创建外键,然后修改映射以包含外键。
modelBuilder.Entity<Pizza>()
.HasMany(p => p.Toppings)
.WithMany()
.Map(m => m.ToTable("ToppingsForPizza")
.MapLeftKey("PizzaId")
.MapRightKey("ToppingId"));
(因为它可能是一个独特的复合键,阻止了多个浇头的添加。)