Posts
163
Comments
181
Trackbacks
5
lunedì 17 marzo 2014
La modifica ad un file ASPX genera un errore Type 'System.Web.UI.WebControls.UpdatePanel' is not defined


Migrando un progetto da Visual Studio 2010 al 2012 mi sono trovato in una situazione spiacevole: ogni modifica fatta ad un file ASPX qualsiasi genera una serie di errori del tipo:

Type 'System.Web.UI.WebControls.UpdatePanel' is not defined.   

Nella pratica il designer di Visual Studio referenzia gli UpdatePanel usando il namespace System.Web.UI.WebControls.UpdatePanel invece di usare il namespace corretto System.Web.UI.UpdatePanel. Probabilmente sta cercando di usare una vecchia versione delle Ajax Extension che ovviamente non sto usando ne referenziando.

Esiste anche un bug aperto su Connect, che però è stato marcato come risolto perché non riproducibile (creando progetti da zero, sembra infatti che non si riesca ad ottenere lo stesso comportamento). Cercando un po’ su Internet, non sono l’unico ad avere il problema che, per inciso, persiste anche utilizzando Visual Studio 2013. I suggerimenti sono svariati (aggiornare le reference a System.Web.Extension, trascinare il controllo direttamente dalla toolbox, etc, etc), ma per me l’unico che ha funzionato è quello di aggiungere la seguente registrazione direttamente nelle pagine ASPX:

<%@ Register tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" %>

La registrazione è già fatta a livello di web.config, ma evidentemente il designer di Visual Studio ha qualche problema se non viene messa anche nella pagina ASPX.

Non è il massimo dato che occorre modificare le singole pagine ASPX, ma almeno funziona.

posted @ lunedì 17 marzo 2014 11.49 | Feedback (0)
martedì 4 giugno 2013
Javascript & HTML 5 - Chiamate cross-domain usando iFrame, postMessage e localStorage

L’esigenza penso che possa essere comune a molti: supponiamo di avere due pagine, A e B memorizzate su domini differenti. Supponiamo di aprire B da A  e di voler refreshare A quando un determinato evento si verifica in B (ad esempio l’utente preme sul classico bottone “Salva”).

Come fare? Il solito Google ci viene in aiuto con una miriade di hack e trucchi vari che però nel nostro scenario non sono tutti applicabili. Se la pagina B viene aperta con il classico window.open, una soluzione banale è quella di impostare il document.domain di entrambe la pagine ad un valore comune. Facendo questo la pagina B può richiamare una funzione qualsiasi del chiamante usando la sintassi: window.opener.MyFunction.

Questa soluzione è efficace nei casi più semplici, ma può generare effetti spiacevoli, soprattutto se A o B (o entrambe) richiamano a loro volta altre funzioni o altre pagine. In questi casi infatti il document.domain va impostato su tutte le pagine, altrimenti avremo problemi di sicurezza in altre chiamate.

La soluzione che propongo in questo post è un po’ più complessa ed è un mix delle varie tecniche che si possono trovare in giro:

  1. Al verificarsi dell’evento desiderato nella pagina B, andremo ad impostare un valore usando il localStorage.       
               
       1: localStorage.setItem("MyProperty", 'myValue');

    Il localStorage è una delle tante novità di HTML 5 ed è supportato su tutti i browser moderni (per IE dalla versione 8 in su). In alternativa al localStorage si può usare il sessionStorage oppure per maggiore compatibilità anche i “vecchi” cookie.

    Il valore impostato sarà disponibile per il dominio B, ma non per A che quindi, se ci accede, lo troverà vuoto.

  2. Nella pagina A inseriamo un iFrame che punterà ad una nuova pagina C, memorizzata nello stesso dominio di B. La pagina C può essere una semplice pagina HTML che conterrà il seguente codice javascript:
       
       1: setInterval(function () {      
       2:     var storageValue = localStorage.getItem("MyProperty");
       3:     if (storageValue != null) {
       4:         window.parent.postMessage(storageValue, "*");
       5:         // Remove the property
       6:         localStorage.removeItem("MyProperty");
       7:     }
       8: }, 400);    

    Sostanzialmente viene creato un timer che ciclamente controlla la proprietà andando a leggere il localStorage. Nel caso venisse trovata valorizzata la proprietà cercata, verrà postato un messaggio al parent utilizzando il metodo postMessage. Il metodo consente di inviare messaggi cross domain tra le finestre del browser. Nell’esempio window.parent referenzierà la pagina A che è quella che sta aprendo C all'interno dell’iframe. Il secondo parametro del metodo postMessage è l’origine del messaggio e andrebbe valorizzato con il giusto dominio, nel nostro caso con quello della pagina A. Una volta inviato il messaggio alla pagina parent la proprietà verrà rimossa dal localStorage per evitare messaggi multipli.
  3. Nella pagina A va aggiunto un listener che rimarrà in attesa di eventuali messaggi provenienti dall’iFrame:    
       
       1: var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
       2: var eventer = window[eventMethod];
       3: var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
       4:  
       5: // Listen to message from child IFrame window
       6: eventer(messageEvent, function (e) {    
       7:     alert(e.data);
       8: }, false);

    I messaggi inviati alla pagina A vengono gestiti dal listener sull’evento onmessage (o sul vecchio message nel caso si usi attachEvent). Nell’esempio ogni qual volta B invia un messaggio, la pagina A gestirà tale messaggio e la proprietà e.data conterrà il valore MyValue. Chiaramente all’interno della funzione che riceve il messaggio è possibile implementare qualsiasi tipo di logica ed è anche possibile distinguere le eventuali origini dei messaggi utilizzando la proprietà origin dell’oggetto e.


Una soluzione simile, ma più semplice, è applicabile anche quando B è direttamente "hostata" dentro un iFrame di A. In questo caso sarà possibile scambiare messaggi tra A e B senza passare dal localStorage, ma usando direttamente la postMessage con relativa gestione attraverso il listener.

posted @ martedì 4 giugno 2013 16.31 | Feedback (1)
martedì 22 gennaio 2013
Applicazioni ASP.NET e Tablet: supportarli o non supportarli?

Dovendo riprogettare un’applicazione ASP.NET e potendo adottare un nuovo stile grafico, è opportuno o meno sviluppare tenendo in mente il fatto che tale applicazione possa essere usata nei Tablet?

Chiaramente la possibilità di utilizzo sui Tablet non è un’ipotesi o una “fissa mentale”, ma è frutto di richieste di clienti già arrivate da più parti. Detto questo e avendo i soliti problemi di tempo/budget personalmente vedo due strade:

  • Sviluppare un’applicazione web nello stile Hotmail o Gmail progettando bene i controlli e il layout affinché sia tutto utilizzabile decentemente sia sui desktop “classici” sia sui Tablet (bottoni grandi, textbox, combo dimensionate in un certo modo, evitare,  dove possibile, l’uso di dialog e popup e così via)
  • Sviluppare un’applicazione web “classica” ed eventualmente un client specifico per ogni tipo di dispositivo supportato (Windows, IOS, Android, etc..)
A budget infinito sicuramente la seconda strada darebbe all’utente una user experience migliore, ma chiaramente non mi trovo con questa possibilità, tutt’altro. Va detto anche che mancherebbero competenze specifiche sia nello sviluppo in ambienti Apple sia in quelli Android. Della prima via quello che mi lascia un po’ perplesso sono eventuali compromessi da utilizzare, anche se sia Hotmail sia Gmail mi sembrano degli ottimi esempi a livello di usabilità.

Cosa ne pensate? Cosa fareste nei miei panni?

posted @ martedì 22 gennaio 2013 12.43 | Feedback (3)
mercoledì 14 novembre 2012
RhinoMocks: PartialMock e metodi virtuali

Oggi durante la scrittura di alcuni Unit Test mi sono imbattuto in un errore banale, ma che mi ha fatto perdere un po’ di tempo.
Sostanzialmente creando un mock parziale con Rhino Mocks mi saltava fuori sempre la seguente eccezione:

Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#) / Overridable (VB) method).

La creazione del mock parziale è qualcosa del tipo (Visual Basic… si lo so…):

   1: Dim service As IMyService = MockRepository.GeneratePartialMock(Of MyService)()
   2: service.Expect(Function(e) e.MyFunction()).Return(True).Repeat.Once()

Come dice l’errore stesso, il tutto accade se la funzione MyFunction non viene dichiarata come Virtuale (Overridable in Visual Basic).
Le limitazioni di Rhino Mocks (prese da questo link) sono le seguenti:

- You cannot create a mock object from a sealed class.
- You cannot create a mock object from a private interface.
- You cannot intercept calls to non-virtual methods.

posted @ mercoledì 14 novembre 2012 16.23 | Feedback (1)
lunedì 22 ottobre 2012
Problema con l’aggiunta/update di service reference a servizi WCF

Aggiornando o aggiungendo reference a servizi WCF potrebbe capitare che, nonostante non si ricevano errori in Visual Studio, il servizio WCF non sia utilizzabile lato codice e che il namespace usato non venga neanche trovato.
Generalmente questa cosa capita quando ci sono conflitti sui tipi che il tool di aggiunta dei servizi WCF non riesce a risolvere. Se si va a verificare il file Reference.vb (o Reference.cs) generato da Visual Studio per ogni servizio WCF aggiunto, ci si accorgerà che il file è vuoto e da qui i problemi sopra indicati.

Per correggere questo comportamento è sufficiente deselezionare il check “Reuse types in referenced assemblies” presente nella dialog di configurazione/aggiunta del servizio WCF. Se si vuole andare più in profondità e capire bene quali tipi diano errore si può usare l’utility a riga di comando svcutil, che dovrebbe fornire messaggi specifici e più dettagliati.

posted @ lunedì 22 ottobre 2012 11.17 | Feedback (0)
lunedì 8 ottobre 2012
Enterprise Library: configurazione Unity tramite convention

Una delle cose che trovo più comode quando utilizzo un container IOC è quella di registrare i componenti tramite convenzioni. L’Enterprise Library e il modulo Unity, non consentono, di default, di sfruttare questo tipo di registrazione.
Per risolvere questo problema esistono una serie di progetti ed estensioni che implementano tale funzionalità. Non ne ho provati molti, ma UnityConfiguration, giunto alla versione 1.4.1, soddisfa tutte le mie esigenze.  In particolare è possibile utilizzare una serie di convenzioni di default (FirstInterfaceConvention, NamingConvention, etc..) che coprono i vari scenari che ho implementato nei miei progetti. E’ comunque sempre possibile implementare delle custom convention e quindi personalizzare ogni aspetto della registrazione.

Il link alla pagina del progetto è il seguente: https://github.com/thedersen/UnityConfiguration

posted @ lunedì 8 ottobre 2012 14.19 | Feedback (0)
lunedì 1 ottobre 2012
Visual Studio 2012: problema esecuzione Unit Tests da un progetto migrato

Sto iniziando ad usare Visual Studio 2012 per i miei vecchi progetti, sfruttando la possibilità di aprirli sia con il nuovo Visual Studio sia con il “vecchio” 2010.
Di solito la “conversione” procede senza intoppi e senza problemi in fase di esecuzione. Nell’ultima solution convertita ho invece notato un piccolo problema: i test presenti in un paio di Test Project (Microsoft Test) fallivano tutti, uno dopo l’altro.
Guardando l’output dei vari test mi sono accorto che il problema era dovuto al fatto che i file da copiare nella directory di output (in primis la configurazione di NHibernate) non venivano più copiati, nonostante i settings fossero presenti e corretti. La soluzione è stata abbastanza semplice: ho creato un nuovo file di settings, esattamente uguale al precedente, e utilizzando questo nuovo file i problemi sono spariti e tutto è tornato a funzionare alla perfezione.

posted @ lunedì 1 ottobre 2012 14.37 | Feedback (0)
venerdì 6 luglio 2012
Eliminare lo “sfarfallamento” con i Tabs di JQuery

Problema “fastidioso” almeno visivamente parlando: quando si utilizzano i tab di jQuery, in fase di caricamento si nota uno “sfarfallamento” soprattutto nelle macchine più lente o nelle pagine più pesanti (e anche nei browser più veloci…).
In questo post la soluzione: http://www.simple-talk.com/blogs/2010/04/07/avoiding-flicker-with-jquery-tabs/

In breve si tratta di nascondere inizialmente il div che contiene i tabs settando l’attributo display a none e visualizzarlo subito dopo aver richiamato la funzione .tabs che costruisce i tab. Niente di più semplice e devo dire che funziona bene!

posted @ venerdì 6 luglio 2012 11.45 | Feedback (0)
martedì 5 giugno 2012
Visual Studio 2010: errore nell’apertura delle macro

Stamattina mi sono imbattuto in un errore strano: volendo editare una macro in Visual Studio 2010 (con SP1 installato) mi è saltato fuori questo errore:

'Cannot load the recording macro project 'MyMacros; for the following reason: Server Execution Failed. Would you like to recreate it?'

In precedenza avevo già inserito macro personalizzate e quindi l’errore mi è sembrato un po’ strano.
Il solito Google mi ha fornito la risposta che ho trovato qui: http://connect.microsoft.com/VisualStudio/feedback/details/596422/vs2010-crashes-when-trying-to-edit-a-macro

In particolare la soluzione alternativa che riporto qui è quella che nel mio caso ha risolto il problema:

On computers on which Visual Studio 2008 or SQL Server 2008 is installed and Visual Studio 2010 has been uninstalled and then reinstalled, using the Visual Studio Macros IDE may cause Visual Studio to crash
Uninstalling Visual Studio 2010 also removes the Visual Studio Macro Tools package. If the computer also has Visual Studio 2008 or SQL Server 2008, then reinstalling Visual Studio 2010 does not reinstall the Visual Studio Macro Tools package. This causes an error when the Macros IDE is started, and Visual Studio crashes if you try to recreate the MyMacros.vsmacros project.
To resolve this issue:
1. Delete the following file:
* On a 64-bit operating system: "%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\Common7\IDE\1033\Microsoft.VSDesignerUI.dll"
* On a 32-bit operating system: "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\1033\Microsoft.VSDesignerUI.dll"
2. On the Add or Remove programs page, select Uninstall/Change Visual Studio 2010 and then click Next.
3. Select Add or Remove features.
4. Clear and then re-select any of the features in the list. This causes the update state to be enabled.
5. Finish the Setup wizard. Visual Studio Macro Tools should be installed.

posted @ martedì 5 giugno 2012 9.41 | Feedback (0)
venerdì 2 dicembre 2011
Eseguire un assembly in un AppDomain separato

 Nello sviluppo di architetture a plugin può diventare necessario eseguire assembly in un AppDomain separato, magari recuperando gli assembly (con relative dipedenze) da una sottocartella.
In rete si trovano tantissimi esempi, che usano metodi recenti o datati e che sfruttano varie tecniche. Sono però riuscito ad arrivare ad una soluzione che mi soddisfacesse, solo dopo molti tentativi e molte ricerche e quindi mi sembra giusto condividere i risultati della mia ricerca sperando che possano facilitare la vita a qualcuno.

Prima di andare avanti vorrei però esplicitare le mie necessità:

- Eseguire i metodi di una o più classi contenute all’interno di un assembly, in un AppDomain separato;
- Poter caricare nell’AppDomain assembly con reference ad altri assembly “locali” o memorizzati nella GAC; 
- Memorizzare l’assembly (con tutte le sue dipendenze) in una sotto directory;
- Poter passare parametri al costruttore delle classi da creare.
 
La funzione seguente, seppur molto semplice, soddisfa tutte le mie necessità:

   1: Public Sub ExecuteOnAppDomain(ByVal typeName As String, ByVal assemblyName As String)
   2:     Dim domainSetup As AppDomainSetup = New AppDomainSetup
   3:     domainSetup.ApplicationBase = Environment.CurrentDirectory
   4:     domainSetup.PrivateBinPath = "RELATIVE_FOLDER"
   5:     ' Copia delle policy dall'appdomain corrente
   6:     Dim adevidence As Evidence = AppDomain.CurrentDomain.Evidence
   7:     ' Creazione nuovo appdomain
   8:     Dim domain As AppDomain = AppDomain.CreateDomain("SomeAppDomain", adevidence, domainSetup)
   9:  
  10:     ' Argomenti costruttore
  11:     Dim constructorArgs As New List(Of Object)
  12:     constructorArgs.Add("PARAM1")
  13:     ' ....
  14:     ' ....
  15:     constructorArgs.Add(10)
  16:     ' Bindings
  17:     Dim bindings = BindingFlags.CreateInstance Or BindingFlags.Instance Or BindingFlags.Public
  18:     ' Creazione della classe dato il nome completo e l'assembly di riferimento
  19:     Dim obj = domain.CreateInstanceAndUnwrap(assemblyName, typeName, False, bindings, Nothing,
  20:                                              constructorArgs.ToArray, Nothing, Nothing, Nothing)
  21:     obj.DoWork()
  22:     ' Unload dell'appdomain
  23:     AppDomain.Unload(domain)
  24:   End Sub


Alcune note:

- Nella proprietà PrivateBinPath dell’AppDomainSetup è possibile specificare le sottodirectory da utilizzare per il probing degli assembly;
- I parametri del costruttore devono essere specificati nello stesso ordine e devono avere lo stesso tipo di quelli presenti nel costruttore della classe da istanziare;
- L’assembly name non deve contenere il suffisso “.dll” ma solo il nome dell’assembly;
- Il typeName deve contenere il nome completo del tipo della classe da istanziare;
- Tutti gli assembly referenziati devono essere inseriti nelle sottodirectory o nella directory principale del nostro applicativo (o nella GAC);
- La risoluzione delle dipendenze viene fatta in automatico senza dover implementare nessun meccanismo manuale di risoluzione.

posted @ venerdì 2 dicembre 2011 11.16 | Feedback (0)
venerdì 14 ottobre 2011
Publish da linea di comando di un web project ASP.NET

 A volte quando si hanno molti progetti ASP.NET o quando sono necessarie delle azioni aggiuntive da fare dopo la pubblicazione di un’applicazione ASP.NET diventa molto comodo poter pubblicare un web project ASP.NET da linea di comando.

Utilizzando msbuild è possibile ottenere la stessa cosa che si otterrebbe facendo il publish da Visual Studio. L’esempio seguente utilizza msbuild del Framework 4.0 ed è quindi equivalente al Publish fatto da Visual Studio 2010 (indipendentemente se poi si utilizzi il Framework 4.0 o meno nel web project):

msbuild.exe" /t:Rebuild /p:OutDir=DEST_PATH\bin\;WebProjectOutputDir=DEST_PATH\;Configuration=Release;
UseWPP_CopyWebApplication=True; PipelineDependsOnBuild=False "PROJECT_SOURCE_PATH\joshProtocolWebAdmin.vbproj"

L’effetto del comando precedente è:

  1. Compilare le .DLL del progetto web nel path DEST_PATH\bin\
  2. Pubblicare il contenuto del progetto web (pagine ASPX, immagini, CSS, etc, etc) nel path DEST_PATH
  3. Compilare il progetto in Release applicando pre e post build events
  4. Applicare le web.config transformations se presenti

Unica nota: se avete dei path con degli spazi utilizzare i doppi apici classici, ma sostituire gli slash (‘\’) che normalmente si utilizzerebbero con i backslash (‘/’).

posted @ venerdì 14 ottobre 2011 15.33 | Feedback (0)
martedì 6 settembre 2011
Tip: disabilitare il tab design durante l’editing dello XAML

Eccomi di ritorno qui sul blog dopo una lunga assenza con quello che spero sia un utile tip.
In questo periodo sto lavorando molto con Silverlight e quindi con l’editor dei file XAML e sono stato anche io falcidiato da rallentamenti, errori, crash di Visual Studio 2010, insomma da situazioni “poco piacevoli”.

La prima ottimizzazione, per chi come me lavora direttamente sullo XAML, è quella di aprire i file XAML in Visual Studio direttamente nella view del codice. Questo post spiega come abilitare l’opzione.

Anche facendo così si possono “sperimentare” tutti i problemi sopra indicati in quando il tab Design rimane comunque abilitato e in quanto “qualcosa” viene comunque fatto in sottofondo.

Per ovviare anche a questo problema è possibile aprire i file XAML direttamente con il source editor al posto dell’editor standard. Per fare questo:

1) Selezionare un file XAML qualsiasi
2) Tasto destro e selezionare dal menu “Open with”
3) A questo punto selezionare “Source code editor” e settarlo come editor di default

Se non avete bisogno di nessun designer ed editate lo XAML credo che sia la soluzione migliore e la più semplice per lavorare in modo decente.

P.S. L’intellisense continua comunque a funzionare

posted @ martedì 6 settembre 2011 12.06 | Feedback (0)
martedì 12 luglio 2011
Silverlight: Errore “Invalid or malformed application: Check manifest”

Se come nel mio caso ogni volta che create un nuovo progetto Silverlight avete puntualmente questo messaggio di errore, la soluzione è abbastanza semplice: controllate che lo Startup Object del progetto Visual Studio punti ancora ad un oggetto esistente.

Nel mio caso puntualmente modifico i namespace e puntualmente mi dimentico di andare ad aggiornare lo Startup Object che punta al vecchio namespace.

posted @ martedì 12 luglio 2011 14.39 | Feedback (0)
giovedì 10 marzo 2011
Rilasciato NHibernate 3.1.0

La giornata inizia bene! Ho appena appreso che è stata rilasciata la versione 3.1.0 di NHibernate. Qui il link al download, mentre a questo indirizzo potete trovare la release note con le modifiche introdotte.

posted @ giovedì 10 marzo 2011 8.52 | Feedback (0)
martedì 22 febbraio 2011
NHibernate: utilizzare lo 0 per rappresentare l’assenza di entità


Quando si ha a che fare con database legacy, potrebbe saltar fuori la necessità di non inserire nel database valori nulli per le relazioni many-to-one nulle, ma bensì il valore zero.

Questo post su NHForge, discute la problematica e definisce una soluzione. Per chi avesse bisogno della versione in VB.NET ecco il codice convertito:

   1: Public Class NullableTuplizer
   2:     Inherits PocoEntityTuplizer
   3:  
   4:     Sub New(ByVal entityMetamodel As EntityMetamodel, ByVal mappedEntity As PersistentClass)
   5:         MyBase.New(entityMetamodel, mappedEntity)
   6:     End Sub
   7:  
   8:     Public Overrides Function GetPropertyValuesToInsert(ByVal entity As Object, ByVal mergeMap As IDictionary,
   9:                             ByVal session As NHibernate.Engine.ISessionImplementor) As Object()
  10:         Dim values() As Object = MyBase.GetPropertyValuesToInsert(entity, mergeMap, session)
  11:         ' Dirty hack 1
  12:         For i As Integer = 0 To values.Length - 1
  13:             If (values(i) Is Nothing AndAlso GetType(IEntity).IsAssignableFrom(getters(i).ReturnType)) Then
  14:                 values(i) = ProxyFactory.GetProxy(0, Nothing)
  15:             End If
  16:         Next
  17:         Return values
  18:     End Function
  19:  
  20:     Public Overrides Function GetPropertyValues(ByVal entity As Object) As Object()
  21:         Dim values() As Object = MyBase.GetPropertyValues(entity)
  22:         ' Dirty hack 2
  23:         For i As Integer = 0 To values.Length - 1
  24:             If (values(i) Is Nothing AndAlso GetType(IEntity).IsAssignableFrom(getters(i).ReturnType)) Then
  25:                 values(i) = ProxyFactory.GetProxy(0, Nothing)
  26:             End If
  27:         Next
  28:         Return values
  29:     End Function
  30:  
  31:     Public Overrides Sub SetPropertyValues(ByVal entity As Object, ByVal values() As Object)
  32:         ' Dirty hack 3
  33:         For i As Integer = 0 To values.Length - 1
  34:             If GetType(IEntity).IsAssignableFrom(getters(i).ReturnType) Then
  35:                 Try
  36:                     ' Provo ad accedere alla proprietà id
  37:                     If CType(values(i), IEntity).ID = 0 Then
  38:                         values(i) = Nothing
  39:                     End If
  40:                 Catch ex As Exception
  41:                     ' Errore. Il proxy ha restituito un errore
  42:                     values(i) = Nothing
  43:                 End Try
  44:             End If
  45:         Next
  46:         MyBase.SetPropertyValues(entity, values)
  47:     End Sub
  48:  
  49: End Class

Due note: l’interfaccia IEntity è un’interfaccia base implementata dalle mie entità. Nel mio caso definisce solo la proprietà ID, ma potrebbe anche essere completamente vuota o avere altre proprietà comuni.

La funzione SetPropertyValues è invece leggermente diversa da quella proposta sul post linkato in precedenza. In particolar modo, nel mio caso quando provavo ad accedere all’ID della mia entità, veniva sempre lanciata un’eccezione in quanto il proxy non riusciva a trovare l’entità con ID 0. Forse è un mio errore e forse la soluzione proposta (il try-catch) non è il massimo della vita, ma al momento la soluzione funziona.

posted @ martedì 22 febbraio 2011 13.52 | Feedback (0)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS