Domanda

Sto lavorando su un progetto che ha un DB di circa 30 tavoli e circa 100 procedure memorizzate (MSSQL).

  1. 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.

  2. 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.

  3. 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.

  4. 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:

  1. Facile per riflettere DB modifiche della struttura
  2. dati digitati invece di int.Parse(row[0][3].ToString())
  3. alte prestazioni
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top