0

私は EF4.1、RIA サービス、および Silverlight を使用しています。更新シナリオで奇妙な問題が発生しています。

ドメイン モデルは非常に単純です。RequestsPersonsを扱います。それらは 1 対 n の関係にあります。そのため、Citizen は複数の Request を持つことができますが、実際にはアプリがそうする機能を提供していないため、これは決して発生しません。

Requestには「Urgent」というプロパティがあり、これをtrueに変更してから保存しようとしています。このメソッドを介して実際の永続化が開始されるまで、すべてがうまくいきます。

    public void UpdateRequest(Request currentRequest)
    {
        Request original = ChangeSet.GetOriginal(currentRequest);
        try
        {
            ObjectContext.Requests.AttachAsModified(currentRequest, original);
        }
        catch (Exception ex)
        {
            // weirdness here!
        }
    }

これは、RIA Services によって生成されたほとんどの標準的なメソッドです (デバッグ目的で追加した try/catch ハンドラーを除く)。その後、次のエラーが発生します。

ChangeSet を確認すると、追加する Request がないので、誤って追加したのではないと確信しています。

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

私はこれを理解していません... ObjectStateManagerには文字通り追加されたオブジェクトはありません.ChangeSetには追加されたオブジェクトがありません; これは一体どこから来ているのですか?どのプロパティが変更されているかを追跡したので、キーが上書きされたり、追加されたり、その他のファンキーになったりしていないと確信しています。

誰かがここで光を当てることができますか? これまでのところ、数日間私を夢中にさせています...

4

1 に答える 1

0

次のロジックを使用してなんとか修正できました。基本的に、エンティティが既にアタッチされているかどうかを確認しています。そうである場合は、再アタッチせず、値を更新するだけです。それ以外の場合は、添付します。

        ObjectStateEntry entry;
        // Track whether we need to perform an attach
        bool attach;
        if (ObjectContext.ObjectStateManager.TryGetObjectStateEntry(ObjectContext.CreateEntityKey("Requests", currentRequest), out entry))
        {
            // Re-attach if necessary
            attach = entry.State == EntityState.Detached;
        }
        else
        {
            // Attach for the first time
            attach = true;
        }
        if (attach)
        {
            ObjectContext.DocumentRequests.AttachAsModified(currentRequest, original);
        }
        else
        {
            ObjectContext.Requests.ApplyCurrentValues(currentRequest);
        }
于 2016-07-25T10:57:22.100 に答える