none
Progetto Rubrica telefonica con Entity Framework 4.0 RRS feed

  • Domanda

  • Buongiorno,
    dopo varie letture ho deciso di immergermi appieno nel mondo di ADO.net passando per Entity framework.
    Ho iniziato a scrivere delle righe di codice per un semplice programmino che mi gestisca una "rubrica telefonica" (Cognome, Nome, Indirizzo, Telefono, Cellulare) ovvero - per adesso - una sola tabella del DB chiamata "Soggetti". La mia applicazione, per comprendere di cosa sto parlando, dispone dei bottoni NUOVO, ELIMINA, RICERCA, SALVA e STAMPA. Per ognuno di essi stò scrivendo righe di codice per gestirne le funzionalità.
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using AWModel;
    
    namespace frmSoggetti
    {
        public partial class Form1 : Form
        {
            AWEntities context;
            Soggetti sogg;
            bool isNew;
            
            public Form1()
            {
                InitializeComponent();
                StartButton();
            }
    
            private void btnSearch_Click(object sender, EventArgs e)
            {
                //da sistemare
                context = new AWEntities();
                var query = from p in context.Soggettis
                            where p.Cognome == "Baudo"
                            select p;
                BindingSource.DataSource = query.ToList();
            }
    
            private void btnNew_Click(object sender, EventArgs e)
            {
                isNew = true;
                EditButton();
                BindingSource.Clear();
            }
    
            private void btnUndo_Click(object sender, EventArgs e)
            {
                BindingSource.Clear();
                StartButton();
            }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                if (isNew)
                {
                    try
                    {
                        if (txtCognome.Text.Length > 0)
                        {
                            context = new AWEntities();
                            sogg = new Soggetti();
                            BindingSource.EndEdit();
                            sogg.Cognome = txtCognome.Text;
                            sogg.Nome = txtNome.Text;
                            sogg.Ind_Tipo = txtIndtipo.Text;
                            sogg.Ind_Nome = txtIndNome.Text;
                            sogg.Ind_Numero = txtIndCiv.Text;
                            sogg.Telefono = txtTelefono.Text;
                            sogg.Cellulare = txtCellulare.Text;
                            sogg.Email = txtEmail.Text;
                            context.Soggettis.AddObject(sogg);
                            context.SaveChanges();
                            //pulisco i campi
                            BindingSource.Clear();
                            //setto i bottoni Nuovo, Elimina, Salva...
                            StartButton();
                            isNew = false;
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex.InnerException != null)
                            MessageBox.Show(ex.InnerException.Message.ToString());
                        else
                            MessageBox.Show(ex.Message.ToString());
                    }
    
                }
                else
                {
                    //in caso di sole modifiche
                    BindingSource.EndEdit();
                    context.SaveChanges();
                }
                
                MessageBox.Show("Changes saved to the database.");
    
            }
    
            private void StartButton()
            {
                btnNew.Enabled = true;
                btnSearch.Enabled = true;
                btnSave.Enabled = false;
                btnUndo.Enabled = false;
                btnDelete.Enabled = false;
                btnPrint.Enabled = false;
            }
    
            private void EditButton()
            {
                btnNew.Enabled = false;
                btnSearch.Enabled = false;
                btnSave.Enabled = true;
                btnUndo.Enabled = true;
                btnPrint.Enabled = false;
            }
        }
    }
    

    Il tutto funziona quasi correttamente. i miei dubbi sono i seguenti:
    1)come posso intercettare in modo "elegante" un inserimento di qualsiasi campo anzichè utilizzare:
    if (txtCognome.Text.Length > 0)
    2) se dopo aver effettuato una ricerca - bottone SALVA disabilitato - apporto una modifica ad un qualsiasi campo, come posso intercettarla in modo da abilitare successivamete il tasto SALVA?
    3) è troppo parlare di gestione della concorrenza?
    In attesa di una soluzione, a mio dire, più elegante, ringrazio tutti per il contributo.
     
    lunedì 28 novembre 2011 10:42

Risposte

Tutte le risposte

  • Ti consiglio di iniziare a studiare WPF o Silverlight, se vuoi sviluppare applicazioni standalone.

    In particolare adotta il pattern MVVM che sfrutta a pieno il meccanismo di binding di entrambe le tecnologie (che ormai si sovrappongono) e quindi essere indipendente dalla UI (dalla View) e gestire oggetti, non controlli.

    A questo punto la validazione si semplifica molto, ad esempio implementando l'interfaccia IDataErrorInfo.

    Grazie ad ICommand in WPF e Silverlight può gestire "in automatico" l'abilitazione/disabilitazione dei pulsanti in base alla logica applicativa, che diventa testabile in TDD, ciò con dei test, senza eseguire l'applicazione, con un enorme risparmi di tempo e un incremento della produttività.

    Parti da qui:
    http://code.msdn.microsoft.com/windowsdesktop/How-to-implement-MVVM-71a65441

    Dopo MVVM inizia a postare domande specifiche (come quella sulla concorrenza) :).
    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex
    • Contrassegnato come risposta piedatt80 lunedì 28 novembre 2011 18:07
    lunedì 28 novembre 2011 12:02
    Postatore
  • Grazie per la tua risposta, sebbene mi hai sconvolto un po le idee.

    La mia voleva essere una "bozza" per iniziare ad utilizzare EF.

    Ho visto in giro, ma esempi che si avvicinano al mio non ne ho trovati molti.

    Hai qualche esempio basilare da consigliarmi inerente il pattern MVVM?

    Grazie.

    lunedì 28 novembre 2011 18:05
  • Nel link che ti ho postato trovi un esempio banale di utilizzo della pattern M-V-VM. Puoi scaricare la solution in C#.

    Sostanzialmente hai 3 attori:
    1. model: è l'insieme di classi che permettono di definire il problema in termini concreti (Customer, Order, InvoiceService etc...)
    2. view: è il codice XAML (sia in SL che in WPF) che permette di creare la UI, come l'HTML. Il motore di binding è la grossa differenza rispetto a Windows Forms, non è più necessario intercettare gli eventi ed accedere direttamente ai controlli
    3. view-model: è la classe che permette di agganciarsi alla UI nel modo "più comodo", definisce le proprietà in binding con i controlli, i comandi a cui la UI può rispondere ed implementare il comportamento, consente di rendere testare l'applicazione senza eseguirla!

    Per quanto riguarda EntityFramework ho postato diverse solution che trovi tutte in http://sample.codeplex.com.

    Guarda le solution "EntityFramework" ed "EasyEntityFramework", scarica lo zip dal tab "Source Control".
    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex
    lunedì 28 novembre 2011 18:31
    Postatore