Implementazione DAL in .NET con DB-prima
Domanda
Sto lavorando su un progetto che ha un DB di circa 30 tavoli e circa 100 procedure memorizzate (MSSQL).
-
Tutto il codice DAL è implementata utilizzando Data Access Application Block. Credo che questo approccio richiede troppo tempo, anche se ho solo bisogno di aggiungere un nuovo campo a una tabella esistente. In primo luogo, devo aggiornare gli script DB, quindi devo controllare i wrapper SP e / o query che abbiamo nel codice per riflettere i miei cambiamenti.
-
La maggior parte di DAL (90%) è in questo modo:
// "idiom #1" for my project public static DataSet GetSomeData(int a, int b) { return SqlHelper.ExecuteDataSet( connection, "select x, y from tab1 where a = " + a.ToString() + " and b = " + b.ToString()); }
Poi, quando questo è chiamato da qualche parte:
// "idiom #2" var ds = DAL.GetSomeData(123, 456); var t = ds.Tables[0]; var x = t.Rows[0][0]; var y = t.Rows[0][1];
io fermamente che questa idea è veramente terribile, ma non sono esattamente sicuro di ciò che l'approccio giusto è. Sono assolutamente sicuro che quello che mi piacerebbe vedere è oggetti di almeno tipizzati invece di DataRow e collezioni di questi oggetti, invece di DataTable. Sono anche sicuro che io non voglio implementare tutte queste cose da solo.
-
Un paio di giorni fa, ho trovato BLToolkit che sembra per risolvere questo problema, ma non sono sicuro se è buona idea usarlo, dal momento che non ho abbastanza esperienza con esso. Mi è piaciuto molto questo esempio:
public abstract class PersonAccessor : DataAccessor { [SqlText(@"SELECT * FROM Person WHERE FirstName = @firstName")] public abstract List<Person> GetPersonListByFirstName(string @firstName); [SprocName("sp_GetPersonListByLastName")] public abstract List<Person> GetPersonListByLastName(string @lastName); ...
Anche se non posso chiamarlo ORM, questo approccio è astratto-sufficiente per me per farmi voglio invece di quello che ho attualmente, ma dall'altro lato, è ancora abbastanza basso livello.
-
Ho anche provato Fluent NHibernate e sembra essere molto lento, anche se mi piace molto le sue caratteristiche.
Qual è la soluzione proprio qui? Le priorità sono:
- Facile per riflettere DB modifiche della struttura
- dati digitati invece di
int.Parse(row[0][3].ToString())
- alte prestazioni
Soluzione
vorrei suggerire di utilizzare un ORM .NET. Potete saperne di più sulla scelta di un ORM qui:
NHibernate, Entity Framework, record attivi o linq2sql
L'esecuzione di "SELECT * FROM persona WHERE FirstName = @PrimoNome" non sta per essere notevolmente più lento usando un ORM e la velocità di sviluppo ha il potenziale per essere molto più veloce.