如何在链接到实体,多对多添加引用

本文关键字:添加 引用 实体 链接 | 更新日期: 2023-09-27 18:15:53

我有一个多对多关系的谷歌驱动器,文件夹可以有许多父文件夹和文件和文件夹里面。我如何在父文件夹已经存在的地方正确插入我的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);

添加这个当我保存到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();
       }

如何在链接到实体,多对多添加引用

一般来说,您的DbSet.Attach()实体已经存在于数据库中,而DbSet.Add()实体不存在于数据库中。这两个函数将分别在UnchangedAdded状态下将实体附加到上下文。对象图中的所有实体如果还没有被上下文跟踪,也会以这种状态添加。

因此,如果单个实体的跟踪状态不正确,则可能需要更改其跟踪状态。可以这样做:

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