.Net Café

Il blog di Leonardo Alario

A volte, può capitare di aver bisogno di recuperare il valore di una proprietà di tipo identity, nella nostra DAL contestualmente all'inserimento della tupla, nulla di più facile.

Riprendendo l'esempio del mio post precedente della gestione utenti, ho la classe Utente nel mio DM che espone la proprietà di tipo int IdUtente :

[Column(Storage="_IdUtente", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int IdUtente
    {
        get
        {
            return this._IdUtente;
        }
        set
        {
            if ((this._IdUtente != value))
            {
                this.OnIdUtenteChanging(value);
                this.SendPropertyChanging();
                this._IdUtente = value;
                this.SendPropertyChanged("IdUtente");
                this.OnIdUtenteChanged();
            }
        }
    }

Nella DAL quando l'utente è "persistito", ne recuperiamo l'identity assegnato :

public int SalvaUtente(BOL.Utente utente)
{

int idUtente;

   try

   {
             GestioneUtentiDataContext Dt = new GestioneUtentiDataContext();

             using (TransactionScope Ts = new TransactionScope())
             {

                  Dt.Utentes.InsertOnSubmit(utente);
                  Dt.SubmitChanges();

                  // recupero il valore autogenerato dall'identity nel database

                  idUtente = utente.IdUtente;

             }
             Ts.Complete();

             return idUtente;

    }
    catch
    {
        throw;
     }

}

Questo meccanismo funziona anche in scenari più complessi, inoltre IMHO, é sempre meglio racchiudere il tutto in un gestore di transazioni per assicurare l'atomicità dell'operazione. Se qualcosa dovesse andare storto in operazioni correlate nella stessa transazione, il valore identity sarà "bruciato".

Posted by leo.alario | with no comments
Filed under: ,

Durante lo sviluppo di un componente, che utilizza Linq to Sql, nello specifico, un componente che si occupa di gestire gruppi e i relativi utenti , sono incappato in un problema legato alle politiche di caricamento dei dati utilizzate da Linq to Sql, dovuto alla particolare logica, alla base della mia applicazione.

La mia esigenza é quella di caricare i gruppi con i relativi utenti associati, recuperando solo gli quelli non cancellati logicamente, ovvero gestiti sulla relativa tabella tramite un flag "obsoleto" che può assumere valore "S" o "N".

Di default, Linq to Sql carica tutti i gruppi ed i relativi utenti associati sia cancellati logicamente, che attivi.

Per ovviare al problema avrei potuto "spegnere" la proprietà DeferredLoadingEnabled del DataContext, che istruisce opportunamente il framework a adottare politiche di caricamento di tipo lazy loading  e che mi avrebbe permesso in seguito, di caricare per ogni singolo gruppo gli utenti non obsoleti. Ma poiché lavoro con pochi dati, quindi non ho problemi di performance ed é molto comodo ottenere tutto quello che mi serve con un'unica chiamata, ho optato per un'altra soluzione.

Per ottenere il risultato desiderato ho utilizzato la classe DataLoadOptions che fornisce le funzionalità per il caricamento e/o il filtraggio immediati dei dati correlati.

La seguente snippet di codice illustra il funzionamento della classe :

public class Gruppo
{
       private IEnumerable<BOL.Gruppo> Gruppi = null;

       public IEnumerable<BOL.Gruppo> GetGruppi()
       {
        try
            {
               GestioneUtentiDataContext Dt = new GestioneUtentiDataContext();
               DataLoadOptions dlo = new DataLoadOptions();               

               // filtro gli utenti del gruppo recuperandone solo quelli non cancellati  logicamente
               dlo.AssociateWith<BOL.Gruppo>(g => g.Utentes.Where( u => u.obsoleto.Equals('N')));
                Dt.LoadOptions = dlo;

                Gruppi = from Gruppis in Dt.Gruppos
                             where Gruppis.Obsoleto.Equals('N')
                             orderby Gruppis.Descrizione ascending
                             select Gruppis;
                return Gruppi;
           }
           catch
           {
               throw;
           }
       }

}

Posted by leo.alario | with no comments
Filed under: ,

Da qualche giorno é possibile aprire un blog su WindowsClient.Net, comunità online di Microsoft dedicata a tecnologie client (Windows Form, WPF, ect. ).

Io lo ho gia fatto, così posso magari scrivere qualche post in inglese sulla "robaccia client",  che tanto mi piace.  

Posted by leo.alario | 1 comment(s)
Filed under: , , ,

Durante l'evento "Inside Sharepoint", Giuseppe Dimauro nella sua sessione,  ha parlato del modello applicativo "software come servizio", affermando che presto potremmo essere costretti a rivedere, sia il modo con cui concepire il nostro software, ma soprattutto il modo in cui lo stesso  viene sviluppato, venduto, acquistato ed infine utilizzato.

La cosa mi ha incuriosito molto, anche perché nell'azienda in cui lavoro sì era parlato di reingegnerizzare un software esistente utilizzando questo modello,   "googlando" ho trovato questo interessante articolo, che descrive molto dettagliatamente il modello SaaS in tutti i suoi aspetti.

Piccola considerazione personale, forse in Italia e soprattutto nel nostro amato sud, non siamo ancora pronti per utilizzare questo tipo di modello in quanto i clienti, nonostante i vari vantaggi che porterebbe agli stessi (abbattimento dei costi hardware, abbattimento dei costi del software ect.) non vedrebbero di buon occhio il fatto che i loro preziosi dati siano in housing chissà dove e peggio ancora che i loro dati siano condivisi con altri dati di altri clienti.

Staremo a vedere ...

La notizia é fresca fresca, finalmente é disponibile il language pack in italiano del .NET framework 3.5. Oltre a questo aggiornamento  sono stati rilasciati dal team di sviluppo, anche alcuni componenti ridistribuibili. Inoltre é imminente il rilascio di Visual Studio 2008 in italiano, questo dovrebbe avvenire nei primi giorni di febbraio.

Altri dettagli alla fonte

Posted by leo.alario | 1 comment(s)
Filed under: ,

Finalmente é stata rilasciata l'estensione del .NET framework 3.5 ParallelFX , anche se solo in CTP,  che permette ai nostri programmi (Windows, web o servizi) l'esecuzione parallela su più processori (dove disponibili), sfruttando appieno le macchine multiprocessore e di conseguenza determinando un significativo aumento di prestazioni per le nostre applicazioni.

 

Il framework introduce:

  • API per la parallelizzazione di cicli for e foreach;
  • modello dichiarativo per le query LINQ To Objects;
  • classi per la sincronizzazione dei task;

Potete scaricare l'estensione qui, inoltre contestualmente al rilascio dell'estensione, é stata lanciata una nuova sezione di MSDN dedicata al parallel computing.

Non vedevo l'ora che fosse disponibile, mi ci butto a capo fitto :P:P:P

Posted by leo.alario | with no comments

Purtroppo, nella versione Express di Sql Server 2005 é assente un utile strumento di lavoro come SQL Server Agent, disponibile nella versione MSDE che permette di schedulare attività sistemistiche-amministrative  sui database (Backup notturni, Ricostruzione indici, ect).

In alternativa, ci sono diverse strade da seguire per ovviare a questo problema :

  1. Utilizzare le scheduler di Windows in combinazione al comando sqlcmd.exe per lanciare i nostri script;
  2. Utilizzare le classi contenute nel Namespace Microsoft.SqlServer.Management.Smo combinate al .Net Framework;

Per esigenze aziendali, avevo bisogno di uno strumento con le caratteristiche di Sql Server Agent, "googlando" mi sono imbattuto in questo prodotto SQLScheduler.

 SQLScheduler é una applicazione .NET, scritta in C#, composta da un servizio ed una Windows Form che permette di:

  1. Gestire diverse istanze di SQL Server Express;
  2. Schedulare dei job definendone l'inizio, la fine e la ricorrenza;
  3. Inviare a più operatori le mail con i risultati dei job;

Il tutto é completamente gratuito.

Posted by leo.alario | 2 comment(s)