2009-11-04 1 views
5

Sto lavorando su un CMS come mio progetto per hobby. Perché non sono pagato per questo, il tempo non è molto essenziale e aspiro a fare un sistema ben architettato.Quale ORM dovrei usare al posto di Linq su Sql?

Ho un set di classi di business che sono responsabili della logica principale e stanno ottenendo dati da un database tramite interfacce e il provider di dati (che potrebbe implementare un'interfaccia) può essere impostato dalla configurazione.

Attualmente utilizzo LINQ come SQL come livello di accesso ai dati, ma più leggo su questo argomento, più sono convinto che dovrei usare un ORM più avanzato, perché LINQ to SQL non supporta alcune cose sarebbe molto buono per le prestazioni generali dell'applicazione. Ad esempio, memorizzazione nella cache e persistenza. (Ho letto che NHibernate, ad esempio, consulta solo con il database, se necessario, altrimenti ottiene semplicemente i dati dalla sua cache. - Questo è buono, perché in media un sito web non riceve nuovi contenuti per giorni, quindi invece di sprecando le prestazioni leggendo dal database su ogni richiesta, sarebbe giusto servirle da una cache.)

Sto pensando ad alcune opzioni e vorrei sapere cosa dovrei fare a riguardo.

  1. Scrivere la mia logica di persistenza per le mie classi di business e continuare a utilizzare LINQ su SQL.
  2. Usa NHibernate direttamente, o tramite il Castello di ActiveRecord o Fluent NHibernate
  3. usare qualche altro ORM

La mia scelta preferita sarebbe la seconda, perché NHibernate è più robusto di quello che mi serve, e ActiveRecord sembra nascondere la maggior parte della complessità. (E, a proposito, intendo anche usare Castle Windsor.)

L'unico problema è che non sono riuscito a trovare alcuna informazione sulle prestazioni di questi strumenti. Ho trascorso alcune ore a googling (e binging (e stavo cercando anche su questo sito)), ho trovato parecchi articoli e post sul blog, ma nessuno di questi ha detto nulla sulle prestazioni.

Sarà meglio della soluzione corrente o dovrei utilizzare qualcosa di diverso per l'attività?

Grazie in anticipo!

risposta

7

Linq to SQL è bello (se non si utilizzerà nulla tranne SQL Server). Non preoccuparti di Linq to Entities (EF). È rotto (tutt'altro che maturo) - su così tanti livelli.

Mi piacerebbe andare a NHibernate da solo: ottima mappatura delle entità e supporto multipiattaforma della piattaforma DB.E un ORM molto provato e testato.

+2

EF v4 con .NET 4 (fuori marzo 2010) rettificherà molte delle imperfezioni di EF1 - sicuramente vale la pena dare un'occhiata –

+0

Grazie! E che dire di ActiveRecord o Fluent NHibernate? Dovrei usare quelli per rendere NHibernate un po 'più facile? – Venemo

+2

Fluent NHibernate è bello se sei bloccato a mappare i file. Quando ho imparato Nibernate, non ho inserito i file XSD per gli schemi xml. Non ho davvero troppi problemi con l'XML dopo aver iniziato a usare i file XSD. Detto questo. Fluente NHibernate è davvero dolce e dovresti dare un'occhiata a questo. Ciò detto, Fluent NHibernate è un'altra cosa da imparare. Se si finisce per avere problemi con la normale mappatura di nhibernate, allora usare fluentemente. – Min

1

Hai visto S#arpArchitecture? È un framework basato su NHibernate e ASP.NET MVC, su cui è possibile creare l'applicazione.

Bene, se hai intenzione di costruire tutto da zero (forse per conoscere l'architettura), puoi dare un'occhiata al codice sorgente di S # arpArchitecture per ottenere qualche ispirazione.

+0

Grazie per la risposta! S # arpArchitecture sembra promettente, ma il mio progetto non utilizza ASP.NET MVC, perché la sua logica è molto diversa dal pattern MVC. – Venemo

1

Beh, il mio voto sarebbe, prima di scendere lungo la rotta ORM, controllare anche un OODBMS completo.

db4Objects da Versant vale sicuramente la pena dare un'occhiata, è veloce, è ridicolmente facile da usare e piuttosto maturo.

Modifica: Nota, db4Objects supporta anche Linq.

+0

OO I DBMS sono molto sopravvalutati. Se è veloce, generalmente non si adatta molto bene quando si tratta di soluzioni OO DBMS e si interrompe quando si eseguono query incrociate su più di 5 o più entità collegate. –

+0

Hai mai provato db4O? Penso che sarai piacevolmente sorpreso, lo so che lo ero. –

+0

No, in tutta onestà non ho. Guardali prima, e mi è sempre sembrata molto di moda. Non riesco a vedere come un DB DB OO possa competere con un RDMBS appropriato quando si tratta di prestazioni per query complesse, JOIN e sottocategorie. Se ho un momento libero, posso solo dare un'occhiata. O no.;-) –

1

Sarei d'accordo con voi nel prendere la seconda opzione. Non perché so che le prestazioni in questo caso sono migliori, ma perché hai detto che vuoi avere un sistema ben architettato. Nel caso in cui si utilizzi LINQ to SQL, il problema che si presenterebbe è che le classi che si generano utilizzando il trascinamento LINQ dipendono fortemente dallo schema del database e dalla struttura della tabella. Ogni volta che modifichi la struttura della tabella, dovrai rigenerare le classi LINQ. Questo non è desiderabile dal punto di vista di una buona architettura. Si dovrebbe prendere in considerazione l'utilizzo di NHibernate con asp.net mvc. NHibernates ti offre la possibilità di mappare le proprietà dell'oggetto business con i campi della tabella del database tramite file xml. Ciò aggiunge un ulteriore livello di astrazione in cui le entità aziendali non dipendono direttamente dalla struttura della tabella. C'è un buon progetto su codeplex che usa NHibernates. Ecco l'url per quel progetto http://jscportal.codeplex.com/. Questo è un portale CMS molto pulito costruito usando asp.net mvc e NHibernates. Anche questo progetto ti darà un'idea di fare un buon design per la tua applicazione. Ti auguro il meglio !

+0

Mi piace l'idea di MVC, ma questo mio progetto si basa su uno diverso. Proverò sicuramente jscportal, comunque. Grazie per la risposta! – Venemo

4

Vorrei raccomandare Entity Framework v4.0. A differenza del primo, fallito flop di un tentativo di un ORM con EF v1.0, la versione che esce con .NET 4.0 è davvero sorprendente. Microsoft ha migliorato EF su ogni livello e ha risposto direttamente agli input di molti dei principali sostenitori della comunità ORM. Ho avuto alcuni input diretti via e-mail con Microsoft su diversi problemi con EF, tra cui l'efficienza e la validità del SQL generato, la storia n-Tier e il visual designer.

Il nuovo EF è un ORM solida che fornisce una storia completa OOB per tutto da un ricco visual designer con la generazione personalizzabile codice, la generazione SQL efficiente, multi-tier tipi portatili, implementazione stile POCO, molto ricche mapping tra il codice, modello concettuale, e schema di database, ecc. Ero un grande sostenitore di nHibernate e un forte oppositore di EF, ma la mia opinione è cambiata da quando ho iniziato a utilizzare VS2010/.NET 4.0 Beta 2. Raccomando vivamente di utilizzare EF v4.0 se stai lavorando sulla piattaforma .NET.

+0

Sì, quando .NET 4 sarà definitivo, considererò EF v4. Fino ad allora, EF in .NET 3.5 è più che ridicolo. – Venemo

+1

+1 vorrei poter cambiare più di una volta! :) –

+0

È bello sentirlo, ho appena finito un piccolo progetto usando EF 1.0 e ci sono stati molti mal di testa. –

2

Direi che NHibernate + FluentNhibernate potrebbe farti funzionare rapidamente. La cosa migliore di FluentNhibernate è che puoi configurarlo in poche righe e mapperà automaticamente gli oggetti nel tuo database per te.

Se si desidera qualcosa che è un po 'più leggero sulla configurazione si potrebbe voler controllare Subsonic

+1

Parlando di Fluent NHibernate, cosa ne pensi di Castle ActiveRecord? – Venemo

+1

Castle ActiveRecord va bene, tuttavia ritengo che fluente abbia alcuni vantaggi. Il primo è che puoi usare le convenzioni per configurare i tuoi mapping. Il secondo è che puoi mappare i tuoi oggetti senza dover apportare modifiche ai tuoi file di classe. Con la registrazione attiva devi usare gli attributi che ritengo un po 'inquinanti del tuo modello di oggetto. – lomaxx

+0

Questo veramente risponde ad alcune domande per me. Grazie mille! – Venemo

1

dal momento che questo è il progetto è per l'apprendimento uso di scopo NHibernate è davvero valsa la pena sforzo di imparare :)

1

Questa domanda è stato chiesto e ha risposto molte volte prima:

NHibernate, Entity Framework, active records or linq2sql

+0

Grazie per la risposta! Tuttavia, se avessi letto la domanda prima di pubblicare la tua risposta, sapresti che ho già cercato Stack Overflow, e penso che quegli argomenti, mentre sono utili, non si applicano al mio progetto specifico. – Venemo

+0

La prossima volta, fornisci collegamenti nella tua domanda a ciò che hai già letto. C'è molto poco nella tua domanda che è unica e nuova che non è mai stata posta prima. Onestamente non vedo perché la tua situazione sia unica. Non è carino da parte tua insinuare che non ho letto la domanda. Lo leggo moltissimo, più volte. –

+0

Siamo spiacenti! La prossima volta starò più attento. Grazie per la risposta! – Venemo