問題:保存.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
は私が解決するために試したものですが、今でエラーが発生します。どんな助けでも大歓迎です!ありがとう!
"エラーが発生しました。「何のエラーが出ますか? – krillgar
"エンティティオブジェクトはIEntityChangeTrackerの複数のインスタンスによって参照できません。" – MattCucco
データベースから取得したものとは異なるDbContextで保存しようとしているようです。おそらく、すべての反射を開始する前に、あなたは1つを処分したでしょうか? – krillgar