Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Reference na objekty v ADO.NET Data Services

| Webdesign

Pokud se rozhodnete pro vaše AJAXové aplikace požívat RESTové služby ADO.NET Data Services, jistě se dostanete do situace, kdy máte komplexní typ a potřebujete vytvořit novou entitu s odkazem na již existující objekt.

Řešení tohoto problému jsem hledal dost dlouho, nakonec bylo celkem jednoduché.

Problém

AJAXově vytvářím entitu, která má vlastnost User, což je reference na uživatele, který danou entitu vytvořil – kterému patří.

Cesta k řešení

Nejprve jsem zkoušel využít něco podobného, jako je u entit, které jsou vráceny pomocí metody GET. Tedy odkaz na jinou entitu je vyjádřen pomocí vlastnosi __deffered a ta má atribut uri, který odkazuje na již existující entitu pomocí jejího URL. Bohužel, to nefungovalo, protože __deffered je metodou POST ignorováno. Kód vypadal asi následujícně:

User: { __deffered: { uri: "/Users(13)" } }

Pak jsem tedy zkusil druhý zoufalý krok. Zkusil jsem použít atribut ID, který je vlastně jediný důležitý pro správné persistování do databáze. Kód následující:

User: { Id: 13 }

Jenže ani to není správná cesta, navíc si tak můžete Usera poškodit.

Konečné řešení

Konečné funkční řešení se od toho původního pokusu skoro neliší, ano byl jsem hodně blízko a vzal to oklikou a až důkladné čtení dokumentace mi otevřelo oči. Vlastnost __metadata byla aktuálně tou správkou, která se měla použít! Takže správný kód vypadá takto:

User: { __metadata: { uri: "/Users(13)" } }

Závěr

Já vím, není to žádná super extra informace, ale já k jejímu získání spotřeboval celkem dost času. Možná to někomu ušetří starosti a hledání… Pokud vás zajímají ADO.NET Data Services – což je velice zajímavá technologie – můžete se přijít podívat na naši přednášku o ASP.NET, kde o nich bude utroušeno několik slov a předvedena pěkná ukázka ve spojení s AJAXem a k databázi budeme přistupovat přes NHibernate místo Entity Frameworku.

Tagy: ,

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.