データベースに行を追加しましたが、更新するために別のコンテキストで戻ってきました。私はこのクラスを持っています:
public abstract partial class DataManager<I, C>
where C : class, IDomainObject, I, new( ) where I : IDomainObject
C は EntityObject かもしれませんが、このクラスはそれを知りません。
私の保存は次のようになります。
public virtual bool Save( I _item )
{
bool rc = true;
try
{
var set = m_Context.GetObjectSet<I, C>( );
ObjectStateEntry stateEntry = null;
if( ! m_Context.ObjectStateManager.TryGetObjectStateEntry( ( C ) _item, out stateEntry ) )
{
if( _item is EntityObject )
{
if ( _item.IsNew )
{
set.AddObject( ( C ) _item );
}
else
{
try
{
set.Attach( ( C ) _item );
}
catch( Exception ex )
{
set.ApplyCurrentValues( ( C ) _item );
}
等々...
私のテスト ケースでは、TryGetObjectStateEntry で stateEntry が見つかりません。ただし、これは EntityObject であり、新しいものではない (IsNew が私のフラグです) ため、else に移動します。ここに私の問題があります:set.Attachはこのエラーをスローします
「同じキーを持つオブジェクトが既に ObjectStateManager に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。」
そして次の瞬間に、ApplyCurrentValues はこれをスローします。
「提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした。提供されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認してください。」
これらの両方がどのように真実である可能性がありますか?
詳しくは:
_item は別のコンテキストで Get によって作成されました。その後、そのコンテキストは破棄されました。その時点で、_item には EntityState.Unchanged がありました。それにいくつかの変更を適用したところ、EntityState.Modified に変更されました。(コンテキスト (およびその ObjectStateManager) がなくなっているはずだったので、私はそれを期待していませんでした。) とにかく、保存 (上記) に到達すると、状態は (デバッガーによって報告されたように) Modified ですが、私は持っていますそれまでに新しいコンテキスト。この時点ですべての ObjectStateEntries (Added、Deleted、Modified、Unchanged) のリストを取得した場合、ApplyCurrentValues が報告するように 2 つしかなく、_item はそれらの 1 つではありませんが、「それはそこにも!」。おそらく問題は、それがまだ古い ObjectStateManager にアタッチされていることです (ObjectStateManager を破棄させない参照があるでしょうか?)。