2009-05-29 12 views
10

Stiamo per iniziare uno sviluppo di ASP.NET MVC e abbiamo utilizzato il nostro framework di entità per anni. Tuttavia, abbiamo bisogno di supportare più di quanto il nostro framework di entità sia in grado e quindi vorrei avere alcune opinioni sull'utilizzo di MVC con un framework più solido. Abbiamo ristretto le scelte o su NHibernate (con le API Fluent) o LINQ su SQL.Quale framework di dati è migliore per un sito ASP.NET MVC - LINQ to SQL o NHibernate

Quale framework si presta meglio allo sviluppo in stile MVC (so SO utilizza LINQ to SQL)?

Se vogliamo supportare SQL Server, Oracle, MySQL - questo esclude LINQ to SQL?

+1

C'è anche il subsonico 3 con i modelli di mvc. –

+0

Non restituire un oggetto IQueryable rende Linq-to-SQL un'API fluente? – Nick

risposta

4

Ho avuto un grande successo utilizzando Fluent NHibernate e l'iniezione di dipendenza (Ninject, nel mio caso) con MVC.

Mi sembra comunque che qualsiasi ORM maturo funzioni bene con MVC. Poiché la natura di MVC (Model/View/Controller) separa le tre preoccupazioni, qualsiasi ORM dovrebbe adattarsi abbastanza bene al ruolo di "Modello".

+0

Questo è lo stack al quale sono attualmente inclinato. Dove ci sono dei trucchi di cui dovrei essere a conoscenza? –

+0

Nessuno che venga subito in mente, o almeno che non sono ora risolti. Inizialmente avevo implementato il mio modulo per la d-iniezione dei controller MVC, ma ora esiste un'implementazione ufficiale di Ninject: http://github.com/enkari/ninject.web.mvc/tree/master Sono sicuro che ora MVC sia guadagnando rapidamente popolarità, gli altri framework DI hanno moduli simili se non si utilizza Ninject. A seconda di quanto sia complessa la tua configurazione di NH, potresti avere un po 'di lavoro in più per far sì che le fabbriche di sessione si iniettino, ma FNH gioca molto bene con DI dalla natura della sua interfaccia DSL. –

+0

Stuart - Perché un tipo di struttura/tecnologia di accesso ai dati preferisce un altro nello sviluppo di ASP.NET MVC? Ho pensato che ASP.NET MVC non ha assunto alcuna ipotesi (né ha alcun pregiudizio) sul tipo di accesso ai dati utilizzato? Dal momento che l'accesso ai dati avviene da qualche parte nel Modello, potrei usare ADO.NET tradizionale se avessi un codice di accesso ai dati solido che avevo già scritto e che volevo riutilizzare. – Matt

2

LINQ to SQL è per SQL Server. Entity Framework supporta anche altri database.

NHibernate è una buona scelta. È possibile utilizzare Castle ActiveRecord (è costruito sopra NH) se si sta facendo un'applicazione basata su dati o Sharp Architecture per la guida del progetto.

1

Entity Framework si integra perfettamente con MVC e supporta altri database.

1

La risposta breve (e non molto utile) è che entrambe le ORM menzionate funzioneranno con MVC. Una risposta più lunga è che dovresti pensare a come vuoi lavorare con i tuoi oggetti modello. Ad esempio, si desidera eseguire il primo sviluppo di domini (ad esempio un approccio basato su Domain Driven Design) o si sta implementando un'applicazione di tipo "moduli su dati" in cui si potrebbe voler generare un livello di accesso ai dati da un db esistente? Qual è la tua preferenza per specificare i mapping? Vuoi utilizzare un'interfaccia fluente o sei soddisfatto della mappatura dei file (o degli attributi sui tuoi oggetti di dominio)?

Questi sono il tipo di domande che è necessario esaminare quando si sceglie un ORM, e sono per lo più indipendenti dal fatto che si stia utilizzando MVC o Winforms.

6

Come qualcuno che è appena passato da LINQ to SQL a (Fluente) NHibernate, ecco alcune cose che ho notato.

  1. LINQ  -  SQL voluto così tanto tempo per capire come fare l'equivalente di un join-sottoclasse. Dopo molte modifiche, ho letto da qualche parte che non è possibile. Può mappare l'ereditarietà solo se TUTTE le colonne si trovano nella stessa tabella. Questo è bello se ci sono poche colonne, ma nel mio caso ci sono tonnellate e le sottoclassi sono genitori di altre sottoclassi e così via. Perché dovrei metterli tutti in una tabella per il mio ORM?

  2. NHibernate per esperienza è stata robusta (a volte troppo per i piccoli progetti veloci) e anche se familiarità con esso attraverso piccoli progetti, ho sentito che potrebbe essere troppo e sono andato il percorso di LINQ  -  SQL quando ho potuto generare un file DBML e andare avanti in pochi minuti.

  3. NHibernate fluente. Prende il meglio di entrambi i mondi (nel mio caso). Posso mappare il modo in cui voglio e avere il mio database come voglio e non dover scendere a compromessi nel mio dominio o nei modelli di dati. Anche una parola: Automapping ... ciliegina sulla torta.

avrei dovuto andare con un altro ORM una volta ho trovato limitazioni e ha colpito un paio di dossi stradali con LINQ  -  SQL, ma Fluent NHibernate fatto questa scelta facile, e io non credo che sarò lascialo a meno che qualcosa non ritorni a fare il lavoro ancora meglio.

Quindi, come ha detto Rob Scott, la domanda è: come stai astringendo il tuo dominio => modello di dati? E stai iniziando con un dominio o un database? Quanto sono complesse le relazioni? Se possiedi un'eredità, direi semplicemente di andare con un quadro ORM ricco e risparmiarti il ​​dolore.

Fluente NHibernate ha la documentazione migliore che abbia mai trovato e ci sono così tanto supporto, note, blog e risorse che è auto-odio fare qualsiasi cosa in meno ... IMO! Sono stato attivo e funzionante in meno di 24 ore.

Oh e se siete nuovi a NHibernate, prendete il libro NHibernate in Action per aiutare a ingrassare le ruote anche se c'è molto aiuto anche per quel quadro.

la migliore indicazione che uno strumento non funziona è quando si deve lavorare lo strumento ... LINQ  -  SQL ero la personalizzazione, la lettura di libri bianchi, ogni sorta di follia e si è rifiutato di generare query appropriati, proprio quando ero tentato di modificare il mio tavolo e dominio, ho detto lasciami fare un giro a Fluent, e sono felice di averlo fatto.

Buona fortuna a te .. Ci scusiamo per la lunga risposta; questo è tutto negli ultimi cinque giorni, quindi credo di essere ancora coinvolto :-)

+2

Questo è esattamente il tipo di esperienza che stavo cercando di imparare. Tendo a pensare al modello di dominio, non a db.Lo strumento ORM che abbiamo creato internamente gestisce l'ereditarietà in più tabelle, quindi sono abituato a renderlo disponibile. Sembra che la mia scelta di perseguire il fluente nibernato sia stata quella giusta. –

+0

5x1llz - Perché un tipo di struttura/tecnologia di accesso ai dati preferisce un altro nello sviluppo di ASP.NET MVC? Ho pensato che ASP.NET MVC non ha assunto alcuna ipotesi (né ha alcun pregiudizio) sul tipo di accesso ai dati utilizzato? Dal momento che l'accesso ai dati avviene da qualche parte nel Modello, potrei usare ADO.NET tradizionale se avessi un codice di accesso ai dati solido che avevo già scritto e che volevo riutilizzare. – Matt

+0

Ho anche trovato il Fluent come la migliore soluzione disponibile al momento. :) @Matt, MVC non fa davvero assumptios, ma ancora, un ORM può essere più conveniente di un altro. – Venemo

0

Entity Framework rende le cose complesse. Utilizzare Fluent NHibernate, con pattern Repository e inversion of control in controller.

NHibernate renderà le cose più semplici. Recentemente siamo passati da Entity Framework a Fluent Nhibernate e Fluent NHibernate è sicuramente il candidato migliore.