Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Entityframework使用多对多导航属性保存记录_C#_Mysql_Entity Framework - Fatal编程技术网

C#Entityframework使用多对多导航属性保存记录

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) 每个购物清单都包含一个项目列表,每个项目都可以与多个购物清单相关 每个客户都包含一个购物清单-每个购物清单可以与多个

我正在使用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)

我得到这个错误:

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();
           }
   }