与重复条目的多对多关系

时间:2013-10-04 01:01:56

标签: c# asp.net-mvc entity-framework many-to-many

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

有办法做到这一点吗?

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

3 个答案:

答案 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"));

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