使用RIA Services更新实体时出现奇怪的InvalidOperationException

时间:2013-02-19 15:31:13

标签: c# .net silverlight entity-framework wcf-ria-services

我正在使用EF4.1,RIA服务和Silverlight。我在更新方案中遇到了一些奇怪的问题。

域模型非常简单;它处理请求。他们有一对一的关系。因此,公民可以拥有多个请求,但实际上这将永远不会发生,因为应用程序根本不提供这样做的功能。

请求有一个名为' 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时,会添加 no 请求,所以我确定我没有意外添加。

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

我不明白这一点......在ObjectStateManager中添加了很多 no 对象,ChangeSet中添加了 no 对象;这到底是从哪里来的?我跟踪了哪些属性正在被更改,因此我确定密钥不会被覆盖,也不会被添加或其他一些时髦。

有人能在这里说清楚吗?到目前为止,让我疯狂了好几天......

1 个答案:

答案 0 :(得分: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);
        }