2

我正在尝试使用实体框架和流畅的 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数据库无法支持...我猜是因为需要一个唯一的主键。

有没有办法做到这一点?

编辑:我的实际问题与披萨无关,这只是我想出的例子。

4

3 回答 3

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

应用于比萨饼和浇头没有多大意义..... ;-)

于 2013-10-04T03:42:56.960 回答
0

我认为您应该将双份意大利辣香肠视为单独的浇头。但是,您也可以创建第三个类,如下所示:

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; }
}
于 2013-10-04T02:25:27.920 回答
0

另一种可能的解决方案是先关闭代码和模型验证,按照其他人的描述创建一个新的主键,在您的关系表中为 PizzaId 和 ToppingId 创建外键,然后修改您的映射以包含外键。

modelBuilder.Entity<Pizza>()
            .HasMany(p => p.Toppings)
            .WithMany()
            .Map(m => m.ToTable("ToppingsForPizza")
               .MapLeftKey("PizzaId")
               .MapRightKey("ToppingId"));

(因为它很可能是一个唯一的复合键,它阻止了添加多个浇头。)

于 2013-12-12T19:24:04.887 回答