允许重复多对多?

时间:2013-04-13 18:23:00

标签: c# entity-framework ef-code-first many-to-many duplicates

我有一个项目表,其中有许多自己的作业:

public virtual ICollection<Item> Related { get; set; }

modelBuilder.Entity<Item>().HasMany(x => x.Related ).WithMany();

数据:

Item_Id   Item_Id1
8         2
8         3
8         4

如何允许重复,例如允许另外8-2,当我尝试插入另一个“重复”数据时,它只显示1。

3 个答案:

答案 0 :(得分:2)

我认为问题的根源是误解实体是什么。实体是唯一的,并且具有唯一的ID,因此,例如,公司可以拥有一组独立的雇员,因此您不能在同一个集合中拥有同一个人的两个实例。如果您有购物车,则必须将集合中的项目视为“订单行”而不是项目本身。任何订单行都有自己的Id和对实体的引用,即您正在购买的对象。

答案 1 :(得分:1)

我没有具体检查,所以你可能需要弄清楚细节 -
但是(我认为这样做的唯一方法是manually define索引表(例如Item2Item)。

  

查看我发布的这篇文章以获取更多信息   EF code-first many-to-many with additional data   这是关于如何为多对多创建自定义表 - 添加   其他领域。

现在你有了一个自定义表,你需要稍微改变一下 - 你需要从.HasKey中删除复合键。 使用您自己的PK ,例如与任何其他表一样的身份。

即。你可以定义一个独特的PK,像任何其他表一样的身份 - 并将其作为你的密钥。这应该让你的fk列中有重复的键)。

<小时/> 检查这篇文章,因为它似乎在逻辑上接近(虽然不一样)
Many to many (join table) relationship with the same entity with codefirst or fluent API?

答案 2 :(得分:0)

这给了我最终解决方案 - &gt; EF Code First, how can I achieve two foreign keys from one table to other table?,NSGaga感谢方向

public class Item : IValidatableObject
{
    [Key]
    public int ID { get; set; }
    public virtual ICollection<ItemRelation> Related{ get; set; }
    public string Name { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (....)
        {
            yield return new ValidationResult("Name not valid", new[] { "Name" });
        }

    }
}

public class ItemRelation
{
   [Key]
    public int ID { get; set; }

    public int ItemAID { get; set; }
    public virtual Item ItemA { get; set; }

    public int ItemBID { get; set; }
    public virtual Item ItemB { get; set; }

}



    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<ItemRelation>().HasRequired(c => c.ItemA)
                            .WithMany(m => m.Related)
                            .HasForeignKey(c => c.ItemAID)
                            .WillCascadeOnDelete();

        modelBuilder.Entity<ItemRelation>().HasRequired(c => c.ItemB)
                           .WithMany()
                           .HasForeignKey(c => c.ItemBID)
                           .WillCascadeOnDelete(false);


    }

    public DbSet<Item> Items { get; set; }
    public DbSet<ItemRelation> ItemsRelations { get; set; }

数据:

Id   ItemA_Id   ItemB_Id
1    8         2
2    8         3
3    8         5
4    8         5
5    8         5
6    1         6
7    5         4
8    2         9