Bogus InvalidOperationException (in a DataServiceRequestException)

Posted by Andrei Rinea on Stack Overflow See other posts from Stack Overflow or by Andrei Rinea
Published on 2009-09-11T13:58:13Z Indexed on 2010/05/20 23:20 UTC
Read the original article Hit count: 725

I am having a hard time with ADO.NET Data Services (formerly code-named Astoria) as it gives me a bogus exception when I try to insert a new entity from the silverlight client and trying in a clean project (the same code) doesn't.

In both cases, however, data is correctly inserted into the database. Using Fiddler (an HTTP debugger I could see that there is no problem in the HTTP communication as I will show later in this question.

The code :

var ctx = new MyProject123Entities(new Uri("http://andreiri/MyProject.Data/Data.svc"));

var i = new Zone()
{
  Data = DateTime.Now,
  IdElement = 1
};

ctx.AddToZone(i);

i.StareZone = new StareZone() { IdStareZone = 1 };
ctx.AttachTo("StareZone", i.StareZone);
ctx.SetLink(i, "StareZone", i.StareZone);

i.TipZone = new TipZone() { IdTipZone = 1 };
ctx.AttachTo("TipZone", i.TipZone);
ctx.SetLink(i, "TipZone", i.TipZone);

i.User = new User() { IdUser = 2 };
ctx.AttachTo("User", i.User);
ctx.SetLink(i, "User", i.User);

ctx.BeginSaveChanges(r =] ctx.EndSaveChanges(r), null);

when run the last line (ctx.EndSaveChanges(r)) will throw the following exception :

System.Data.Services.Client.DataServiceRequestException was unhandled by user code
  Message="An error occurred while processing this request."
  StackTrace:
       at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.HandleBatchResponse()
       at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.EndRequest()
       at System.Data.Services.Client.DataServiceContext.EndSaveChanges(IAsyncResult asyncResult)
       at MyProject.MainPage.[]c__DisplayClassd6.[]c__DisplayClassd8.[dashboard_PostZoneCurent]b__d5(IAsyncResult r)
       at System.Data.Services.Client.BaseAsyncResult.HandleCompleted()
       at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.HandleCompleted(PerRequest pereq)
       at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.AsyncEndRead(IAsyncResult asyncResult)
       at System.IO.Stream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
       at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.AsyncEndGetResponse(IAsyncResult asyncResult)
  InnerException: System.InvalidOperationException
       Message="The context is already tracking a different entity with the same resource Uri."
       StackTrace:
            at System.Data.Services.Client.DataServiceContext.AttachTo(Uri identity, Uri editLink, String etag, Object entity, Boolean fail)
            at System.Data.Services.Client.MaterializeAtom.MoveNext()
            at System.Data.Services.Client.DataServiceContext.HandleResponsePost(ResourceBox entry, MaterializeAtom materializer, Uri editLink, String etag)
            at System.Data.Services.Client.DataServiceContext.SaveAsyncResult.[HandleBatchResponse]d__1d.MoveNext()
       InnerException:

(there is no further information regarding the exception although the ADo.NET Data Service is configured to return detailed informations)

However the row is inserted correctly and completely in the database. Using fiddler I can see that the request :

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"    
  xmlns="http://www.w3.org/2005/Atom">
  <category scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" term="MyProject123Model.Zone" />
  <title />
  <updated>2009-09-11T13:36:46.917157Z</updated>
  <author>
    <name />
  </author>
  <id />
  <link href="http://andreiri/MyProject.Data/Data.svc/StareZone(1)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/StareZone" 
    type="application/atom+xml;type=entry" />
  <link href="http://andreiri/MyProject.Data/Data.svc/TipZone(4)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/TipZone" 
    type="application/atom+xml;type=entry" />
  <link href="http://andreiri/MyProject.Data/Data.svc/User(4)" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/User" 
    type="application/atom+xml;type=entry" />
  <content type="application/xml">
    <m:properties>
      <d:Data m:type="Edm.DateTime">2009-09-11T16:36:40.588951+03:00</d:Data>
      <d:Detalii>aslkdfjasldkfj</d:Detalii>
      <d:IdElement m:type="Edm.Int32">1</d:IdElement>
      <d:IdZone m:type="Edm.Int32">0</d:IdZone>
      <d:X_Post m:type="Edm.Decimal">587647.4705</d:X_Post>
      <d:X_Repost m:type="Edm.Decimal" m:null="true" />
      <d:Y_Post m:type="Edm.Decimal">325783.077599999</d:Y_Post>
      <d:Y_Repost m:type="Edm.Decimal" m:null="true" />
    </m:properties>
  </content>
</entry>

is well accepted and a successful response is returned :

HTTP/1.1 201 Created
Date: Fri, 11 Sep 2009 13:36:47 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
DataServiceVersion: 1.0;
Location: http://andreiri/MyProject.Data/Data.svc/Zone(75)
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
Content-Length: 2213

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xml:base="http://andreiri/MyProject.Data/Data.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <id>http://andreiri/MyProject.Data/Data.svc/Zone(75)</id>
  <title type="text"></title>
  <updated>2009-09-11T13:36:47Z</updated>
  <author>
    <name />
  </author>
  <link rel="edit" title="Zone" href="Zone(75)" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CenterZone" type="application/atom+xml;type=feed" title="CenterZone" href="Zone(75)/CenterZone" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ZoneMobil" type="application/atom+xml;type=feed" title="ZoneMobil" href="Zone(75)/ZoneMobil" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/StareZone" type="application/atom+xml;type=entry" title="StareZone" href="Zone(75)/StareZone" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/TipZone" type="application/atom+xml;type=entry" title="TipZone" href="Zone(75)/TipZone" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/User" type="application/atom+xml;type=entry" title="User" href="Zone(75)/User" />
    <category term="MyProject123Model.Zone" scheme="http://schemas.microsoft.com ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
    <m:properties>
      <d:IdZone m:type="Edm.Int32">75</d:IdZone>
      <d:X_Post m:type="Edm.Decimal">587647.4705</d:X_Post>
      <d:Y_Post m:type="Edm.Decimal">325783.077599999</d:Y_Post>
      <d:X_Repost m:type="Edm.Decimal" m:null="true" />
      <d:Y_Repost m:type="Edm.Decimal" m:null="true" />
      <d:Data m:type="Edm.DateTime">2009-09-11T16:36:40.588951+03:00</d:Data>
      <d:Detalii>aslkdfjasldkfj</d:Detalii>
      <d:IdElement m:type="Edm.Int32">1</d:IdElement>
    </m:properties>
    </content>
</entry>

Why do I get an exception? And, using this in a clean project does not throw the exception..

© Stack Overflow or respective owner

Related posts about ADO.NET

Related posts about ado.net-data-services