实体框架插入具有现有寄存器的多对多实例,创建重复的寄存器

时间:2018-10-02 18:35:56

标签: c# entity-framework linq

好吧,我有这个配置:

  • 项目具有0个或多个 Groups 和0个或多个 Users (表 GroupsItem UsersItem
  • 用户在0个或多个项目
  • 之内 在应用程序中独立创建
  • 用户

这是问题所在:当我尝试插入新的项目时,我必须指出其用户是什么(已经存在)。发生这种情况时,表 GroupsItem UsersItem Item 已正确填充,但是我在 Groups < / strong>和用户

这是我的代码摘要:

项目

public class Item {
    public ICollection<Groups> GROUPS{ get; set; }
    public ICollection<Users> USERS{ get; set; }
}

:(用户具有相同的结构)

public class Groups{
    public ICollection<Item> ITEM { get; set; }
}

插入新的项目

public static void InsertingItem(){
    Item example = new Item(){
        GROUPS = AlreadyExistingGroup()
    }
    using (myDbContext db = new myDbContext()){
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

就是这样。 AlreadyExistingGroup是一种返回List<Groups>的方法,该方法填充了数据库中已经存在的组,将这些组引入的方法是一个将一个组引入一个函数的函数,但是多次调用: / p>

public static Groups FetchGroups(int id) {
        try {
            using (myDbContext db = new myDbContext ()) {
                Groups group = db.GROUPS.Where(x => x.CODGROUP == id).FirstOrDefault();
                return group;
            }
        } catch (Exception e) {
            return null;
        }
      }

我做错了什么,导致组和用户处的寄存器重复?

2 个答案:

答案 0 :(得分:1)

使用我们在评论中遇到的正确解决方案来编辑​​我的答案:

问题出在代码中的两个不同的DbContext上:

public static void InsertingItem(){
    Item example = new Item(){
        // DbContext #1 is created in this method
        GROUPS = AlreadyExistingGroup(); 
    }
    // And this is DbContext #2
    using (myDbContext db = new myDbContext()){
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

解决方法是对新项目的查找和插入使用相同的DbContext。示例:

public static void InsertingItem(){
    using (myDbContext db = new myDbContext()){
        Item example = new Item(){
            // refactor the AlreadyExistingGroup method to accept a DbContext, or to move
            // the code from the method here
            GROUPS = AlreadyExistingGroup(dbContext) ;
        }
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

如果我正确理解了您的设置,我认为您希望网上论坛仅具有一个父项引用。

public class Groups{ public Item ITEM { get; set; } // }

此外,我并没有提出批评或批评,只是建议:在询问EF问题时也张贴模型配置会很有帮助。因为...好吧... EF可能很挑剔。又名:

modelBuilder.Entity<Group>() .HasMaxLength(50) .WhateverElseYouConfigure();

答案 1 :(得分:1)

根据您对注释的澄清,在新Group实体中设置它们时,似乎正在使用未跟踪(未附加)的UserItem实体。将Item实体添加到Items DbSet时,其被跟踪为EntityState.Added。 EF会传播Item实体的对象图,并遇到未跟踪的相关实体(即您设置的UserGroup集合),它将以{ {1}},从而在这些实体的数据存储区中插入新记录。

要解决此问题,请手动将这些相关实体附加为EntityState.Added。例如,您可以使用DbContext.AttachRange method

EntityState.Unchanged

或者每个实体,您也可以通过DbContext.Entry method

附加
db.AttachRange( existingGroups );