EF 5.0中多对多关系中的重复行

时间:2014-04-07 10:39:44

标签: c# entity-framework many-to-many insert-update

我有这两张桌子

[Table("Designs")]
public class Design
{
    [Key]
    public Int64 ID { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}

[Table("Tags")]
public class Tag
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Design> Designs { get; set; }
}

这是我的背景

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            this.Configuration.ValidateOnSaveEnabled = false;
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Design>().HasMany(m => m.Tags).WithMany(m => m.Designs).Map(m => { m.MapLeftKey("DesignID"); m.MapRightKey("TagID"); m.ToTable("DesignsToTags"); });
        }

有一些标签

enter image description here

这是交叉表

enter image description here

我尝试更新设计标签

    public Design EditDesign(Design design, int[] newTags)
    {
        var entry = ctx.Entry(design);

        entry.Collection(m => m.Tags).Load();


        design.Tags = newTags.Select(m => ctx.Tags.Find(m)).ToList();

        entry.State = System.Data.EntityState.Modified;
        ctx.SaveChanges();

        return design;
    }

此代码在标记表中添加重复值(ID == 3和16相同),但在 DesignsToTags 表中一切正常

enter image description here enter image description here

如何防止添加重复值?

1 个答案:

答案 0 :(得分:0)

终于找到了问题

我需要在获得设计时包含标签

var design = ctx.Designs.Include(m => m.Tags).Single(m => m.ID == model.Id);

而不是

var design = ctx.Designs.Find(model.Id);

一切都很完美。