3

これは何ヶ月も前から発生しており、非常にイライラさせられる問題です。

私はエンティティを持っています... StorageContract ...契約から継承します。TPT (タイプごとのテーブル) 関係から作成されました (それが違いを生むかどうかはわかりません)。コントラクトの更新された定義を Update メソッドに渡して、既存の StorageContract を更新しようとすると...

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        Context.ObjectContext.ApplyCurrentValues("Contracts", contract);
        Context.SaveChanges();
        return contract;
    }

... エラーが表示されます ...

"An object with a key that matches the key of the supplied object could not be found in the ObjectStateManager"

次の投稿を見つけました...「提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした」...これにより、契約パラメーターを「アタッチ」しようとしました。

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        Context.ObjectContext.AttachTo("Contracts", contract);
        Context.SaveChanges();
        return contract;
    }

...これは、前のエラーとは正反対の混乱を招くように見えるエラーになります...

"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

最初のエラーは、エンティティが見つからないため更新できないことを示していました...これは、エンティティが既に存在するため更新できないことを示唆しているようです(??)。とにかく、それは私を次の投稿に導きました...「同じキーを持つオブジェクトは ObjectStateManager に既に存在します。ObjectStateManager は同じキーを持つ複数のオブジェクトを追跡することはできません」。SO私はそれに基づいてコードをもう一度作り直しました...

    public StorageContract UpdateStorageContract(StorageContract contract)
    {
        var origEntry = Context.Entry<StorageContract>(contract);

        if (origEntry.State == System.Data.EntityState.Detached)
        {
            var set = Context.Set<StorageContract>();
            StorageContract attachedEntity = set.Find(contract.Id);

            if (attachedEntity != null)
            {
                var attachedEntry = Context.Entry(attachedEntity);
                attachedEntry.CurrentValues.SetValues(contract);
            }
            else
            {
                origEntry.State = System.Data.EntityState.Modified;
            }
        }
        Context.SaveChanges();
        return contract;
    }

同じエラーが発生します...

"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

私はこれを毎ターン陥没するうさぎの穴に追い込んでいます!私はこれについて助けを切望しています!!

ありがとう!

4

1 に答える 1

1

これを試してみませんか:

var set = Context.Set<StorageContract>().Local;
StorageContract attachedEntity = set.Find(contract.Id);

違いはローカルにあります。

于 2013-09-15T05:48:03.500 に答える