1

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

编辑,添加了一些代码

在分配 i 的新父母之前添加此内容会出错。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();
       }
4

1 回答 1

0

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

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

// eg give the entity the unchanged state
context.Entry(myEntity).State == EntityState.Unchanged; 
于 2013-05-29T23:06:29.613 回答