2016-04-15 7 views
5

Ich habe die folgende gespeicherte Prozedur, die nur ein Objekt durch ID findet.Aufruf von DocumentDb gespeicherten Prozeduren von .net

function sample(id) { 
    var context = getContext(); 
    var response = context.getResponse(); 
    var collection = context.getCollection(); 

    var findObject = "SELECT * FROM Objects o where o.userId='" + id +"'"; 

    // Query documents and take 1st item. 
    var isAccepted = collection.queryDocuments(
     collection.getSelfLink(), 
     findObject, 

     function (err, feed, options) { 
      if (err) throw err; 

      // Check the feed and if empty, set the body to 'no docs found', 
      // else take 1st element from feed 
      if (!feed || !feed.length) throw new Error("Object not found"); 
      else response.setBody(feed[0]); 
     }); 

    if (!isAccepted) throw new Error('The query was not accepted by the server.'); 
} 

Und das meine C# Klasse ist, die

Dokument
public class UserPoints: Document 
{ 
    [JsonProperty("userId")] 
    public Guid UserId; 

    [JsonProperty("remainingPoints")] 
    public int RemainingPoints; 
} 

In meiner Hauptfunktion erweitert, nenne ich die oben gespeicherte Prozedur und erwarten, dass es die UserPoints für die Benutzer-ID-Objekt zurück.

ZB:

UserPoints points = new UserPoints() 
{ 
    UserId = Guid.NewGuid(), 
    RemainingPoints = 1000 
}; 

await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseName, collection), points); 
points.Dump(); 

var response = await client.ExecuteStoredProcedureAsync<UserPoints>(UriFactory.CreateStoredProcedureUri(databaseName, collection, storedProcedureName), points.UserId.ToString()); 
response.Response.Dump(); 

Ich erhalte die folgende Ausnahme Konnte nicht das Objekt des Typs ‚Microsoft.Azure.Documents.Document‘ werfen ‚UserPoints‘ zu geben, wenn ich die gespeicherte Prozedur

ausführen

Alles funktioniert gut, wenn ich einfach die Document-Basisklasse erweitern, aber dann habe ich keinen Zugriff auf die Selflink-Eigenschaft, die ich für Updates benötige. Mache ich etwas falsch? Wenn ExecuteStoredProcedureAsync einen starken Typ verwendet, sollte es nicht in der Lage sein, es zu umwandeln und das Objekt dieses Typs zurückzugeben?

+1

PS. Für jede Operation in DocumentDB benötigen Sie kein SelfLink mehr. Sie können jetzt einfach die ID der Ressource verwenden, auf die Sie verweisen möchten. Zum Beispiel ReplaceDocumentAsync (UriFactory.CreateDocumentUri ("meine Datenbank-ID", "meine Sammlungs-ID", "meine Doc-ID"), aktualisierter_Dok_Objekt). Weitere Informationen hierzu finden Sie unter https://azure.microsoft.com/en-us/blog/azure-documentdb-bids-fond-farewell-to-self-links/ –

Antwort

0

Dies ist ein Fehler im DocumentDB .NET SDK. Wir untersuchen eine Lösung.

Beachten Sie, dass Sie als eine Problemumgehung, bis der Fix freigegeben wird, müssen Sie nicht von Dokument ableiten, um Dokumente in DocumentDB zu speichern. Wenn Sie Zugriff auf einige interne Eigenschaften wie ID benötigen, können Sie diese Eigenschaften zu Ihrem Objekt hinzufügen, z. als

[JsonProperty("id")] public string Id {get; set;}