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
Dokumentpublic 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ührenAlles 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?
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/ –