好吧,我有这个配置:
这是问题所在:当我尝试插入新的项目时,我必须指出其组和用户是什么(已经存在)。发生这种情况时,表 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;
}
}
我做错了什么,导致组和用户处的寄存器重复?
答案 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
实体中设置它们时,似乎正在使用未跟踪(未附加)的User
和Item
实体。将Item
实体添加到Items
DbSet
时,其被跟踪为EntityState.Added
。 EF会传播Item
实体的对象图,并遇到未跟踪的相关实体(即您设置的User
和Group
集合),它将以{ {1}},从而在这些实体的数据存储区中插入新记录。
要解决此问题,请手动将这些相关实体附加为EntityState.Added
。例如,您可以使用DbContext.AttachRange method
EntityState.Unchanged
或者每个实体,您也可以通过DbContext.Entry method
附加db.AttachRange( existingGroups );