Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:EntityFramework

From Aino Wiki

Jump to: navigation, search

Teoria

ER è un framework ORM (Object/Relational Mapping) messo a disposizione dal Microsoft .NET Framework.
Questo framwork si interpone tra un DataBase ed il livello di applicazione\dominio fornendo facilitazioni per le operazioni CRUD, in altri termini nasconde il funzionamento di un database relazionale, permetterci di pensare al nostro modello dei dati come ad un insieme di oggetti direttamente accessibili dal codice dell'applicativo. Recupera e manipola dati usando oggetti fortemente tipizzati.

EF introduce un approccio Code-First, con ciò ci si concentra nel progetto di codifica del dominio creando le Entità dell'applicativo piuttosto che quelle del DataBase. Con l'approccio Code-First dell'EF il DataBase sarà creato al volo basandosi sulle classi\Entità e configurazioni nel codice sorgente dell'applicativo.

Nel codice vedere la cartella con il diagramma edmx (Entity Data Model x)

Es EDMX EF diagram.png

Considerazioni

Svantaggi': social.msdn.microsoft.com

L’accesso ai dati con Entity Framework anche se giova in fase di sviluppo, che ne velocizza di tempi, appesantisce in fase di manutenzione. Astraendo la base dati, impone che ogni modifica strutturale sia riverberata su entrambe i livelli. Occorrerà fare attenzione a tenere allineati entrambi i livelli, sovente è causa di aggiornamenti di versione non voluti complicando la diagnosi di problemi. Altra obiezione è la scarsa scalabilità (The number in a Microsoft screencast is a maximum of roughly 250 tables per EF model).

Unfortunately, the EF queries are generated by the provider that we cannot control. For some specified query that you want to customize, you can try DataContext.ExecuteQuery(string query, params object[] parameters).

Materiale

Tutorial con concetti:entityframeworktutorial.net

Codice visto come esempio: codeproject.com

Da un progetto Visual Studio si può aggiungere un "New Item" ADO.NET Entity Data Model, es chiamandolo LearnEF avremo creato un LearnEF.edmx (Entity Data Model x)

HowTo

Configurazione del DB puntato

Occorre riaggiornare il modello (file *.edmx), qual'è il file di configurazione a cui si punta attualmente?


Esempi


 

Tips

Transazioni

Articolo che parla di come il SaveChanges(), AcceptAllChanges() possa creare inconsistenze allorché si rende necessaria una transazione: blog MSDN
Occorre aggiungere la reference a System.Transactions
Pseudocodice:

using System.Transactions; // !!!
 
//..
using (TransactionScope scope = new TransactionScope()) 
{ 
    //Do something with context1 
    //Do something with context2
 
    //Save Changes but don't discard yet 
    context1.SaveChanges(false); 
 
    //Save Changes but don't discard yet 
    context2.SaveChanges(false);
 
    //if we get here things are looking good. 
    scope.Complete(); 
 
    //If we get here it is save to accept all changes. 
    context1.AcceptAllChanges(); 
    context2.AcceptAllChanges();
}

Allineamento del DB

Per rifare\aggiornare il binding con la basedati:

  • selezioanre il file *.edmx, doppio click;
  • del file aperto aprire il menu contestuale
  • selezioanre "Update Model from DataBase..."

Quest'ultima selezione nel tipo di sviluppo "database first", come segue:

Entity Framework update EDMX.png

Infine la scelta degli ogetti da aggiornare:

Entity Framework update EDMX Menu scelta.png

NOTE
Può darsi che precedentemente non tutti gli oggetti siano stati inclusi nel modello pertanto con questa operazione si da per scontato l'aggiornamento di quelli già esistenti e EVENTUALMENTE l'aggiunta, mediante la selezione con le check box, di oggetti del DB aggiunti rispetto l'ultimo aggiornamento

Allineamento StoredProcedure

Esiste un caso particolare in cui l'aggiornamento delle SP possa fallire ovvero quando non è chiaro cosa la restituisca.
Es., quando la SP esegue una query dinamica contenuta in una variabile stringa. In questi casi esiste un "trucco" per fargli capire cosa restituisca, basta aggiungere in alto allo script quanto segue:

--Testata della SP
-- BEGIN EF Mapping
IF 1=0
BEGIN
      SELECT 
                    CAST(NULLAS DATETIME)                 AS 'DT_INSERT'
                    ,CAST(NULLAS NVARCHAR(50))             AS 'USERINSERT'
                    ,CAST(NULLAS DATETIME)                 AS 'DT_UPDATE'
                    ,CAST(NULLAS NVARCHAR(50))             AS 'USERUPDATE'
                    ,CAST(NULLAS UNIQUEIDENTIFIER)  AS 'ROWGUID'
END
-- END EF Mapping

--Selezione, immaginandola su tabelle temporanee o risultato di un EXECUTE @ScriptSQL
SELECT 
   DT_INSERT,
   etc,
   GUID
FROM #Tabella

Errori e soluzioni

Riferimento ad una Tabella non aggiornato

Può capitare che in seguito a modifiche ad una tabella, rinominata o per altre modifiche, il suo riferminento sia sparito, purtroppo per quanto si sia aggiornato il modello questo errore sembra inspiegabile. Ecco come correggerlo, a posteriori comunque verificare da FileSystem che i files della classe siano cancellati e richreati correttamente.

EntityFramework Table Mapping Error.png

Mappa e Link


C#


Visual Studio


Parole chiave: Entity Framework , EF

Author