0

我正在使用 EF4.1、RIA 服务和 Silverlight。我在更新场景中遇到了一个有点奇怪的问题。

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

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 服务生成的标准方法(除了我为调试目的添加的 try/catch 处理程序。)然后我收到以下错误:

当我检查ChangeSet时,没有添加任何请求,所以我确定我没有偶然添加它。

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 回答