2

我有 Item 表,它本身有 manyTomany:

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。

4

3 回答 3

2

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

于 2014-06-12T17:19:30.500 回答
1

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

查看我制作的这篇文章以获取更多信息 EF code-first many-to-many with additional data 这是关于如何为多对多创建自定义表 - 添加额外字段。

现在您有了一个自定义表,您需要对其进行一些更改- 您需要从.HasKey. 而是使用您自己的 pk,例如任何其他表的身份。

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


检查这篇文章,因为它在逻辑上看起来很接近(虽然不一样)
多对多(连接表)关系与具有 codefirst 或流式 API 的同一实体?

于 2013-04-13T18:46:13.870 回答
0

好吧,这给了我最终的解决方案--> EF Code 首先,如何实现从一个表到另一个表的两个外键?, 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
于 2013-04-14T10:09:50.423 回答