2016-08-18 14 views
0

問題:保存.SaveChangesと参照(によって渡されたEFのオブジェクト)

私はhowerver、データベースからそれを引いた後、オブジェクトへの変更を加えることができ、私はContext.SaveChanges()メソッドを介してオブジェクトを保存することはできません。

既に試み:オブジェクトに変更トラッカを追加

は、(エラーになる)、変更した後すぐに保存、SaveChangesメソッドを使用して記事を読みます。

考えられる問題:

オブジェクトがいくつかの関数に渡されています。

私は通常EFに問題はありませんが、ここでは多くの反射を使用しています。私は、オブジェクトを振り返る必要があるむしろ大きなプログラムに取り消しボタンを追加しています。取り消しをクリックすると、実際のオブジェクトが引っ張られ、 'after object'に対してテストされ、一致すると、どのプロパティ値が変更されたかが特定され、beforeオブジェクトから値が設定されます。変更を保存し、データベースを更新する必要があります。ここで

はいくつかのコードです:新Luk_StackUp_ProgramEntities

'First we need to find the object in the list given the id in UndoRedoLog 
    Dim ObjectNow As ClsUndoRedoItem 

    Try 

     ObjectNow = (From a In UndoRedoLog Where a.ID = IdNow).SingleOrDefault 

    Catch ex As Exception 'Fail 

     ObjectNow = Nothing 
     MsgBox("Could not find the item. Either does not exist or there is multiple with same id. " + ex.ToString) 

     Exit Sub 
    End Try 

    'Is this a new object? 
    If ObjectNow.ID = -1 Then 

     MsgBox("This object does not exist yet") 

    End If 

    'See if after object is the same as the object in the database 
    Dim ActualObject As Object = "" 

    'if this is a redo object, don't check since all of that has already been done 
    If ObjectNow.WhatGroupChanged.isRedo = True Then 

     GetDataBaseObject(ObjectNow.AfterObject, ActualObject) 

    Else 

     Try 'Pass the after object since that is the object that should be stored in Db 
      Call TestActualObject(ObjectNow.AfterObject, ActualObject) 

     Catch ex As Exception 'Fail 
      MsgBox(ex.ToString) 
     End Try 

    End If 

    'Now set the actaul object to before if it is not null 
    If Not (ActualObject Is Nothing) Then 

     Try 'Set to the before object 

      'Need to find change and set that value 
      SetChangedProperties(ActualObject, ObjectNow.BeforeObject) 
      Db.Entry(ActualObject).State = Entity.EntityState.Modified 

     Catch ex As Exception 
      'Failed 

      MsgBox(ex.ToString) 
      Exit Sub 
     End Try 

    ElseIf ObjectNow.WhatGroupChanged.isRedo Then 'For redo objects only 

     'Dont allow, does not match what is in the database 
     MsgBox("Cannot Redo object") 

     'Remove from list 
     UndoRedoLog.Remove(ObjectNow) 

     Exit Sub 
    Else 

     'Dont allow, does not match what is in the database 
     MsgBox("Cannot Undo object") 

     'Remove from list 
     UndoRedoLog.Remove(ObjectNow) 
     Exit Sub 

    End If 

    'Switch list 
    ObjectNow.WhatGroupChanged.isRedo = Not (ObjectNow.WhatGroupChanged.isRedo) 

    'switch the before and after objects 
    Dim TempObject As Object = CopyObject(ObjectNow.BeforeObject) 
    ObjectNow.BeforeObject = CopyObject(ObjectNow.AfterObject) 
    ObjectNow.AfterObject = CopyObject(TempObject) 

    'Set the id higher up on the list 
    GlobalCounter.ObjectCounter += 1 
    ObjectNow.ID = GlobalCounter.ObjectCounter 

    'Now save changes 
    Db.SaveChanges() 

として

公開サブUndoRedoAction(整数としてIdNow) 点心Dbのこのコード:Db.Entry(ActualObject).State = Entity.EntityState.Modified は私が解決するために試したものですが、今でエラーが発生します。どんな助けでも大歓迎です!ありがとう!

+0

"エラーが発生しました。「何のエラーが出ますか? – krillgar

+0

"エンティティオブジェクトはIEntityChangeTrackerの複数のインスタンスによって参照できません。" – MattCucco

+0

データベースから取得したものとは異なるDbContextで保存しようとしているようです。おそらく、すべての反射を開始する前に、あなたは1つを処分したでしょうか? – krillgar

答えて

0

よろしくお願いします。@krillgarのおかげで、何が間違っているのか分かりました。私は複数の文脈を宣言し、間違った文脈に保存しようとしていました。だから解決策は私の機能を1つに集約して、ただ一つのコンテキスト内ですべてをやっていることを確認することでした。だから私の関数は新しいコンテキストを宣言し、それぞれのデータテーブルからオブジェクトを取得し、すべてのチェックを行い、値を戻し、すべてを1つの関数に保存します。そのような単純な!

関連する問題