7

Sto preparando un nuovo progetto Windows e mi chiedo che tipo di tecnologia DAL utilizzare. All'inizio cercavo qualcosa di più semplice per non passare troppo tempo a costruirlo. Ma capisco anche che a lungo andare deve essere efficiente e scalabile.Nuovo progetto .NET 3.5: quale tecnologia DAL utilizzare?

Ho intenzione di utilizzare WPF (MVVM) Client e servizio WCF su un sistema a 3 livelli.

Giusto per riassumere tutte le tecnologie esistenti sono a conoscenza:

DataSet

PRO: Potrebbe essere un po 'vecchio stile, ma molto facile da usare e lasciare che la maggior parte dei pezzi da auto generato per te. Un aspetto importante dei set di dati è la facilità di attraversare i dati correlati attraverso le relazioni. Inoltre, in un certo senso, è stato disconnesso dal database e potrebbe semplificare gli aggiornamenti prendendosi cura dei timestamp automaticamente. Include la convalida.

CONTRA: Abbastanza vecchio stile. Alcuni li considerano come veri e propri oggetti/modelli di business ma solo come specchio delle tabelle di dati SQL. Passarli tra servizio/cliente WCF potrebbe essere più difficile degli oggetti di business creati autonomamente.

Enterprise Library 4.1 - Data Access Block

PRO: Il DAL è ben messo in un modello di fabbrica. Si occupa della connessione che si apre e si chiude automaticamente. Molto facile da usare per la maggior parte. Supporta sia dataSet che normali SQL Sp per creare i propri oggetti aziendali. Come parte di un Framework in corso, può essere molto più efficiente da utilizzare in combinazione con il resto della Enterprise Library per un prodotto finale efficiente.

CONTRA: ??

LINQ to SQL

PRO: Auto crea le tabelle SQL in oggetti di business. Facile da CRUD. Teoricamente un modo molto carino per farlo.

CONTRA: Avendo giocato con esso quando è uscito, l'ho trovato traballante ea volte instabile. È già considerato una tecnologia morta dopo che Microsoft ha annunciato che Entity Framework 4.0 - come parte di .NET 4.0 - sarà consigliato da Microsoft. Sono previste solo poche correzioni di bug in .NET 4.0 ma non più piani di estensione delle funzionalità.

Entity Framework 4.0

non so nulla, ma solo che andrà a sostituire tutto il resto come in .NET 4.0. Sono anche tentato di usarlo, tuttavia dal momento che è ancora in BETA, non potrei ancora andare in quel modo.

Sono molto tentato di utilizzare Enterprise Library 4.1 - Blocco di accesso ai dati e creare i miei oggetti di business. Il grande Con è che ci vorrà più tempo per creare il DAL. A meno che qualcuno non riesca a convincermi a utilizzare DataSet tramite il blocco di accesso ai dati.

Quali sono i tuoi commenti e le tue idee? Molte grazie, Kave

risposta

3

Si parla di Entity Framework come parte del "contra" per l'opzione Linq to SQL, ma si dovrebbe considerare al posto di Linq to SQL - fornisce praticamente la stessa funzionalità e molto altro. Per i progetti con database più piccoli offre sicuramente un sacco di soldi per il dollaro. Può essere difficile in EF gestire il contesto per database più grandi e le modifiche dello schema possono causare la rottura delle cose, ma queste sfide ci sono con qualsiasi approccio di accesso ai dati.

Il più grande ostacolo per EntLib, a mio avviso, è che si stanno ancora ruotando i propri oggetti di dati. La Enterprise Library elimina molto del codice idraulico da un'immediata implementazione ADO.NET "vecchia scuola", il che è molto utile, ma non genera oggetti dati che possono essere utilizzati immediatamente per l'interrogazione LINQ.

+0

Stavo riflettendo e penso che tu abbia ragione. Usare EntLib significa ancora molto lavoro creando tutto a mano. Quando hai menzionato EF, intendevi la versione 4.0 BETA o intendi la versione 1.0 effettiva? Ho provato la versione 1.0 la scorsa notte e devo dire che sembra tutto a posto e fa il lavoro. Poco prima ho provato SubSonic, che non riusciva a creare il codice per le mie tabelle di ricerca, che aveva lo stesso nome di uno dei loro campi esistenti. Questo deve aver confuso Subsonic. EF 1.0 ha svolto il lavoro perfettamente e penso che andrò da questa parte. Cosa ne pensi? – Houman

+0

EF 1 non è da nessuna parte come funzionalità come LinqToSql e LinqToSql è piuttosto scarsa funzionalità. A EF 1 manca il supporto per concetti ORM di base come il corretto supporto per il caricamento lazy, supportato da LinqToSql. –

+0

Ho utilizzato l'EF 1.0 per alcune app, quelle con database più piccoli e che non erano critiche per le prestazioni, e ne sono stato abbastanza contento: il requisito di base era "ottenere i dati dentro e fuori dal database". Se le funzionalità, la scalabilità e le prestazioni sono una grande preoccupazione, si potrebbe comunque provare EF, ma potrebbe voler astrarre l'accesso ai dati utilizzando un altro livello software o qualcosa come CSLA, in modo da poter cambiare o aggiornare le tecnologie di accesso ai dati in un secondo momento. Naturalmente, a quel punto, i vantaggi RAD potrebbero non essere più lì e si potrebbe voler considerare uno stack completo personalizzato. –

1

A. Controllare anche NHibernate.

B. DataSet: il più veloce e semplice, ma si codifica molto.

Tutto il resto - l'utilizzo degli strumenti ORM è molto utile, ma con il tiering a 3 livelli vi sono molti problemi.

(lazy loading è un problema da affrontare, facendo un sacco di alberi di oggetti grandi che le prestazioni effetto, la cache non è intelligente come possibile)

Quindi - dipende da quello che è il vostro importanti esigenze, e quanto tempo che vuoi dedicare allo studio di EL/LINQ o di NHibernate prima di iniziare la codifica, b/c c'è una curva di apprendimento con questi strumenti.

2

Abbiamo utilizzato in precedenza DataSet con Application Block di EntLib 4.1.

Ora utilizziamo Entity Framework. Abbiamo ottenuto un notevole miglioramento della produttività con Entity Framework rispetto a EntLib 4.1. (Progammate il livello dati per 80 tabelle in 10 ore invece di 80)

Entity Framework 4 è ancora in beta, ma se ci vorrà un po 'di tempo prima che il progetto venga avviato, andrò con EF 4. Otterrete la produttività di un ORM allo stesso tempo la flessibilità dell'uso di POCO (Plain Old Clr Objects)

+0

Grazie per aver condiviso la tua esperienza. È stato utilizzato EF 1.0 o EF 4.0 Beta? – Houman

+0

@ Kave, era EF 1.0, ma abbiamo iniziato a usarlo mentre era in Beta –

1

La migliore idea è avere l'opportunità di utilizzare entrambe le tecnologie contemporaneamente. Come puoi farlo? È molto semplice con pattern di repository. All'inizio è necessario creare un'interfaccia IRepository generica. A qualcosa piace:

public interface IERepository<E> 
{ 
    DbTransaction BeginTransaction(); 
    void EndTransaction(); 
    void Add(E entity); 
    void Delete(E entity); 
    int Save(); 

    ObjectQuery<E> DoQuery(string entitySetName); 
    IList<E> SelectAll(string entitySetName); 
    E SelectByKey(int Key); 

    bool TrySameValueExist(string fieldName, object fieldValue, string key); 
    bool TryEntity(ISpecification<E> selectSpec); 

    int GetCount(); 
    int GetCount(ISpecification<E> selectSpec); 
    int AddAndSave(E entity); 

} 

Preferisco Entity Framework. Ho creato 3 progetti basati su di esso. Funziona molto velocemente, specialmente le query con il paging. Quindi, dopo aver creato il repository di classe generica di base con metodi virtuali, implementare l'interfaccia IRepository. E questo è tutto. Ora avete modo molto veloce per creare Dal scrivere codice semplice come questo:

public class MonthRepository:Repository<Month> 
{ 

} 

avrai la possibilità di sovrascrivere tutti i metodi di classe di base e di creare l'accesso a DB utilizzando stored procedure in cui è necessario. E puoi farlo senza cambiare il codice in altri posti. Il tuo sarà ancora restituire lo stesso tipo di entità ma le otterrà in altro modo.

Reade più http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx

+0

Grazie amico. Questa soluzione sembra davvero interessante se mi desse maggiore flessibilità nello scambio del repository. Ho ancora bisogno di capirlo prima però. Dammi qualche giorno per studiarlo dopo il lavoro, per favore. ; o) – Houman

1

NHibernate ha il miglior mix complessivo del set di funzionalità, la maturità, e il supporto.

NHibernate, Entity Framework, active records or linq2sql

Si dovrebbe considerare LINQ supporta una priorità per qualsiasi soluzione si considera e le prime due opzioni di cui sopra non supportano LINQ.

+0

Ciao Michael, Stavo leggendo anche su NHibernate. Ho trovato la documentazione non così semplice e sembra essere un'applicazione molto complicata da eseguire. A meno che tu non conosca alcuni siti web di walkthorugh che ancora non conosco, mi sento un po 'perso lì. Sfortunatamente SubSonic non ha funzionato per me a causa di un bug. C'è ancora il progetto Castle che potrei provare, o semplicemente attenersi a soluzioni MS come EF 1.0 sperando di aggiornare presto alla v4.0 una volta disponibile. – Houman

+0

Se non riesci a orientarti su NHibernate, non avrai probabilmente nemmeno quello che ti serve da LinqToSql o da EntityFramework. La documentazione di NHibernate non è molto peggio di qualsiasi altra documentazione di ORM. C'è una curva di apprendimento per qualsiasi ORM, la curva di NHibernate inizia appena prima. È probabile che NHibernate soddisfi le tue esigenze, mentre gli altri probabilmente soddisfano solo le tue esigenze fino a un certo punto e poi finisci per ricominciare da capo con NHibernate. In definitiva, è la tua chiamata e la tua responsabilità. –

+0

Grazie Michele. Cosa ne pensi di quel Fluent NHibernate? È una specie di wizard per ottenere automaticamente la mappatura generata per me? Esistono strumenti di aiuto per semplificare la vita con NHibernate? – Houman

Problemi correlati