C# 如何在linq中对实体、多对多添加引用

C# 如何在linq中对实体、多对多添加引用,c#,entity-framework,C#,Entity Framework,我有一个谷歌驱动器的多对多关系,其中的文件夹可以有许多父文件夹和文件和文件夹内。在父文件夹已经存在的地方,我如何正确地插入到我的db项中,这里我得到了重复值错误。我用的是FE 6.0v var gDoc = new GoogleDoc(); /// do some entity stuff /// foreach (ParentReference parent in input.Parents) {

我有一个谷歌驱动器的多对多关系,其中的文件夹可以有许多父文件夹和文件和文件夹内。在父文件夹已经存在的地方,我如何正确地插入到我的db项中,这里我得到了重复值错误。我用的是FE 6.0v

       var gDoc = new GoogleDoc();
       ///

       do some entity stuff

       ///

       foreach (ParentReference parent in input.Parents)
       {
          var gParent = new GoogleParent();
          ///
          do some entity stuff
          ///
          gDoc.GoogleParents.Add(gParent);

       }

       using (Model2Container dBase = new Model2Container())
       {
            dBase.GoogleDocs.Add(gDoc);
            dBase.SaveChanges();
       }
编辑,添加了一些代码

在添加一个新的参数之前,我会得到一个错误。AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的

       GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id);
       if (gParent != null)
            gDoc.GoogleParents.Add(gParent);
在我保存到数据库时添加了这个

      dBase.GoogleDocs.Add(gDoc);
      foreach (GoogleParent parent in gDoc.GoogleParents)
      {
          GoogleParent gparent = dBase.GoogleParents.SingleOrDefault(s => s.Id == parent.Id);
          if (gparent != null)
             dBase.Entry(gparent).State = System.Data.Entity.EntityState.Unchanged;
     }
     dBase.SaveChanges();
仍然得到重复错误

编辑2:这似乎有效

       using (Model2Container dBase = new Model2Container())
       {
       var gDoc = new GoogleDoc();
       ///

       do some entity stuff

       ///

       foreach (ParentReference parent in input.Parents)
       {
                GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id);
                if (gParent != null)
                {
                    gDoc.GoogleParents.Add(gParent);
                    dBase.GoogleParents.Attach(gParent);
                }
                else
                {
                    gParent = new GoogleParent();
                    ///
                    do some entity stuff
                    ///
                    gDoc.GoogleParents.Add(gParent);
                }
       }   

       dBase.GoogleDocs.Add(gDoc);
       dBase.SaveChanges();
       }
通常情况下,需要附加数据库中已经存在的实体,并添加数据库中不存在的实体。这两个函数将分别以未更改或已添加状态将实体附加到上下文。如果上下文尚未跟踪对象图中的所有实体,则也会在此状态下添加这些实体

因此,如果单个实体的跟踪状态不正确,则可能需要更改该实体的跟踪状态。这可以通过以下方式完成:

// eg give the entity the unchanged state
context.Entry(myEntity).State == EntityState.Unchanged; 

我知道,但谷歌父母是一个列表,只有添加。附件我只能直接在数据库上使用。我不知道如何在作为对象一部分的对象上设置“附加”或“未更改”,因为列表中存储有。@sinofis,您正在添加一个包含对现有实体引用的新文档。您必须确保您的现有实体被上下文以正确的状态(即未更改)跟踪。如果数据库中存在副本,则我无法添加新父级或更改新父级的状态,否则我将得到该错误。我这样做似乎并没有改变它的状态仔细看看你的第二个代码段编辑是做什么的。它循环遍历已经通过gDoc添加到上下文中的Google父对象,并尝试从db中提取该父对象的另一个实例并将其附加到上下文中。注意,如果更改,我将得到AcceptChanges,因为该对象的键值与ObjectStateManager中的另一个对象冲突,因此无法继续。在调用AcceptChanges之前,请确保键值是唯一的。不是最贵的,但我发现了一些有用的东西