C#Entityframework使用多对多导航属性保存记录
我正在使用ADO.NET(来自mysql数据库)创建模型。我有6张桌子: customer、shoppinglist、customer\u shoppinglist(有两个FK,一个用于customerid,另一个用于shoppinglist id)、item和shoppinglist\u item表(有两个FK,一个用于shoppinglist id,另一个用于item id) 每个购物清单都包含一个项目列表,每个项目都可以与多个购物清单相关 每个客户都包含一个购物清单-每个购物清单可以与多个客户相关 现在我有两个问题: 1) 我想添加一个有3个购物清单的新客户。一个存在于db中,两个新的包含其项目列表中的现有项目。 这是我的代码(如果我只向客户添加一个新的购物清单,那么这个代码会很好地工作): 及 (调用函数时,customer中的新购物列表id=0) 我得到这个错误:C#Entityframework使用多对多导航属性保存记录,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我正在使用ADO.NET(来自mysql数据库)创建模型。我有6张桌子: customer、shoppinglist、customer\u shoppinglist(有两个FK,一个用于customerid,另一个用于shoppinglist id)、item和shoppinglist\u item表(有两个FK,一个用于shoppinglist id,另一个用于item id) 每个购物清单都包含一个项目列表,每个项目都可以与多个购物清单相关 每个客户都包含一个购物清单-每个购物清单可以与多个
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
在线:
context.items.Attach(item);
2) 如果我想将新项目添加到客户购物列表项目中,我应该怎么做 发生这种情况是因为您正在将具有相同ID的对象附加到上下文(0/-1)。 您可以通过创建一个单独的函数来解决这个问题,该函数创建一个DbContext,附加并保存该上下文,然后终止该上下文 像这样:
public bool addShoppingItem(Item item){
using (var context = new DBContext())
{
context.items.Add(item);
context.SaveChanges();
}
}
具有相同id(-1)的对象是ShoppingList而不是项目。当我附加项目时,我试图告诉它该项目存在于数据库中,因此当它添加shoppingList对象时,他应该将shoppingList对象项目连接到数据库中的现有项目(即更新shoppingList_项目表,但不更新项目表)。您是说,当您将购物列表中的所有项目添加到objectstatemanager时,它们都没有ID 0?是的,每个项目都有唯一的ID(指定给上述功能的客户从数据库复制,然后进行编辑-每次编辑都会导致ID更改为0-这样我就可以判断是否需要添加新项目或将其连接到现有项目)因此,错误可能来自以下事实:购物列表中有相同的项目,然后将其附加到相同的上下文中。那么你有3个购物清单多次附上相同的id?关键是要有一个上下文来处理所有这些问题,这就是制造问题。
context.items.Attach(item);
public bool addShoppingItem(Item item){
using (var context = new DBContext())
{
context.items.Add(item);
context.SaveChanges();
}
}