如何在linq中实体,多对多添加参考

时间:2013-05-29 22:59:31

标签: c# entity-framework

我对谷歌驱动器有多对多的关系,其中文件夹可以包含许多父文件夹和文件和文件夹。如何在父文件夹已存在的情况下正确插入我的数据库项目,这里我得到重复值错误。我正在使用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();
       }

编辑,添加了一些代码

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

       GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id);
       if (gParent != null)
            gDoc.GoogleParents.Add(gParent);

在保存到db

时添加了这个
      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();
       }

1 个答案:

答案 0 :(得分:0)

通常,数据库中已存在DbSet.Attach()个实体,数据库中不存在DbSet.Add()个实体。这两个函数都将实体分别附加到UnchangedAdded状态的上下文中。如果对象图中的所有实体尚未被上下文跟踪,则它们也会以此状态添加。

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

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