我正在使用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 对象;这到底是从哪里来的?我跟踪了哪些属性正在被更改,因此我确定密钥不会被覆盖,也不会被添加或其他一些时髦。
有人能在这里说清楚吗?到目前为止,让我疯狂了好几天......
答案 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);
}