Sto cercando di decidere i pro ei contro dei 2 ORM principalmente in quest'area.NHibernate vs. EF 4.1+
- Compatibilità con SQL Server 2008 R2 & 2012.
- Questo è molto importante in quanto ci semplicemente non hanno le risorse per eseguire il debug di scarso supporto della tecnologia stack MS esistente.
- Anche pianificare in anticipo dal 2012 è praticamente fuori e i piani per migrare ad esso sono a posto.
- supporto per .NET 4.0 e 4.5 (imminente)
- Ancora una volta molto importante per più o meno lo stesso motivo di cui sopra.
- Gestione transazioni e suggerimenti tabella es. forcescan forceseek, leggi non accettato.
- Un sacco di volte il Query Optimizer fa bene il suo lavoro, altre volte voglio la flessibilità per dirgli cosa fare.
- supporto per la conversazione, l'auto monitoraggio allegare & staccare
- Questo è un po 'fondamentale. Detesto mantenere la sessione aperta per un periodo prolungato. Soprattutto in ambiente di calcolo distribuito/web farm.
- Capacità di gestire il primo sviluppo del codice, creare e aggiornare lo schema senza distruggere i dati.
- EF 4.1 sembra essere carente a questo proposito, sebbene 4.3 sia il salto e legato meglio. Mi piace anche l'annotazione dei dati meglio di classi di mappatura separate in NH. La ragione è che voglio essere in grado di inviare la classe e da lì essere in grado di creare un modello di persistenza senza ampliare il metodo per le classi di mapping.
- Supporto per modello IRepository
- Supporto per LINQ
- Un po 'legato al (6), voglio davvero un buon supporto per LINQ. Non voglio sviluppatori di impazzire con l'attuazione di livello inferiore e ottenere noi stessi bloccati a un particolare ORM
- prestazioni
- supporto per le attività CRUD rinfusa, senza dover caricare i dati nel livello di applicazione. Per esempio. Voglio incrementare tutte le righe in una colonna di una tabella specifica di 1. Non voglio caricarlo in memoria e incrementare le righe una alla volta. Questo sarebbe pazzesco per un'operazione così semplice. Linq2Sql era solito avere Magiq per gestire questo genere di cose, cosa hanno NH e EF?
- Caching, caricamento bisognoso, caricamento lento, proprietà di navigazione.
- Lasciatemi essere sincero, odio queste cose quando sono implicite. La ragione è che è difficile distinguere ciò che è memorizzato nella cache, stantio da ciò che è nuovo. In EF di solito trascino tutte le proprietà di navigazione, perché non voglio che queste proprietà vengano caricate con la top 5, perché è quello che richiede l'operazione corrente, ma più avanti nel flusso un altro sviluppatore tenta di fare un conteggio che sarà impreciso.
- Quindi la mia politica personale - tutti i SOA devono essere apolidi a meno che non vi sia una buona ragione altrimenti. Se hai bisogno di referenziare i dati, prendi dalla persistenza. Sarà più lento ma il codice sarà più leggibile e flessibile.
- Analogamente per la memorizzazione nella cache. È abbastanza complesso in quanto è in ambiente distribuito, voglio che tutto il caching sia molto esplicito. Se uno sviluppatore vuole eseguire il codice contro la cache, dovrebbe farlo, non il codice contro l'ORM, e farlo apparire come se stesse estraendo dati dalla persistenza, mentre in realtà sta ottenendo dati obsoleti.
- Ora la domanda è, NHibernate ha qualche concetto/astrazione che renderebbe il caricamento in cache, desideroso/pigro molto più esplicito di quello attualmente disponibile in EF. In questo caso non mi interessa molto della facilità di sviluppo, mi interessa di più della chiarezza e esplicita.
Inoltre non mi interessa tanto per OSS vs argomento proprietarie. La squadra non può permettersi il tempo di sbirciare sotto il cofano e iniziare a scherzare con il codice di altre persone. Mi interessa di più dell'angolo "funziona" di qualsiasi altra cosa.
domanda Ben scritto, anche se temo che sia un po 'aperto per SO; le domande qui in genere/spesso hanno un codice sorgente e dovrebbero portare a risposte chiare e pratiche. Forse è più adatto a Programmers.SE? – Jeroen