Al een paar weken ben ik in de avond uurtjes een applicatie aan het maken die gebruik maakt van silverlight 1.1 alpha , asp.net, webservices en Linq2Sql. Daarbij ben ik een paar heikele puntjes tegengekomen die ik met jullie wil delen. Ze zullen zeer waarschijnlijk allemaal opgelost zijn in de komende 2.0 beta. Maar als je, zoals ik, voor die tijd ermee aan de slag wilt dan kan je de volgende zaken tegenkomen:
A circular reference was detected while serializing an object of type
Als je een linq2sql object model maakt dan zitten daar naar alle waarschijnlijkheid circular references in. Hier kan de serialization van de webservice niet mee omgaan.
Dit kan je, als je WCF gebruikt, oplossen door Serialization Mode van de DataContext op UniDirectional te zetten.
Als je zoals ik gebruik maakt van een “ouderwetse” webservice, omdat ik WCF, Silverlight 1.1 alpha en de silverlight proxy generator van Visual Studio 2008 maar niet goed aan de praat krijg. Dan kun je dat op 1 manieren oplossen.
Een simpele oplossing is om de association weg te halen, maar dit is in veel gevallen niet wenselijk.
Je kan ook een van de 2 referenties op “internal” zetten in plaats van “public”. Deze Access property is er voor de Child property en Parent Property van de Association. Vaak is de child property niet nodig in je model. Let alleen wel op, deze is dus nu ook niet meer beschikbaar in Linq Queries.
JSON_cannotconvertobjecttotype
In eerste instantie gebeurde er gewoon helemaal niets, ik probeerde een webservice aan te roepen en toen hield hij er gewoon mee op. Na wat verdere inspectie kwam ik bij de fout JSON_cannotconvertobjecttotype.
Na wat zoekwerk op google, bleek deze fout te ontstaat als je een Guid binnen een class hebt. De fout zit ergens in de alpha code van Silverlight. En dan heb je dus een probleem want de Guid is gegenereerde code uit je database.
Je kan je datamodel aanpassen en gaan werken met incremental id’s. Maar wil je gebruik maken van de aspnet_user tabel (standaard in asp.net 2.0) dan zul je toch echt iets moeten gaan doen met de Guid.
Een andere oplossing is om zelf objects (dto’s) te maken met Guid als string en deze objecten te vullen met de gegevens van de Linq objects. Dit voelde alleen als een heleboel dubbel en repetitief handmatig werk en als echte ontwikkelaar heb ik daar een hekel aan (grijns).
De oplossing die ik uiteindelijk gekozen heb is om via een SearchAndReplace command-line utility in de gegenereerde proxy class alle System.Guid te vervangen door System.String na elke successvolle build.
Hierdoor word de Guid in silverlight dus een string, waar ik mee kan leven. De SearchAndReplace utility is eigen fabricaat dus als iemand interesse heeft kan ik de source op mijn blog plaatsen.
Update 18 Dec 2007 16:08: Dezelfde fout treed op met System.Nullable<> types.
Robertjan Tuit