1

フォルダーに多くの親フォルダーとファイルとフォルダーを含めることができるGoogleドライブには、多対多の関係があります。親フォルダーが既に存在する場所にデータベース項目を適切に挿入するにはどうすればよいですか。ここで値の重複エラーが発生します。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 の新しい親を割り当てるとエラーが発生する前に、これを追加しました。オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。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()存在しないエンティティです。これらの関数は両方とも、エンティティをそれぞれUnchangedまたはAdded状態のコンテキストにアタッチします。コンテキストによってまだ追跡されていない場合、オブジェクト グラフ内のすべてのエンティティもこの状態で追加されます。

その結果、1 つのエンティティが正しくない状態で追跡されている場合は、そのエンティティの追跡状態を変更する必要がある場合があります。これは次のように行うことができます。

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