none
Tecnologias para DataAcces (ORM) RRS feed

  • Debate general

  • Hola, pues tengo hacer una aplicación un ERP complejo en Asp.net MVC, pues bien, estoy aprendiendo y realmente me e familiarizado mucho con este patrón..

     

    Estoy aprendiendo lo que es acceso a datos que es lo más importante a la hora de crear una aplicación de este nivel.

    Que ORM me recomendarías ? cual es el más rapido el mas optimo??, es recomendable usar ORM porque?

     

    Personalmente estuve haciendo algunas pruebas insertando 100 mil registros con un "for" y los resultados son los siguientes:

     

    Entity Framework (Linq to Entity) -> 3 Minutos y 40 segundos

    Linq to Sql                               -> 3 Minutos y 38 Segundos.

    DataReader                             -> solo 30 Segundos.

     

    Realmente me impresiono este ultimo el DataReader, es realmente rápido, pero el códgo es más largo...

    aqui está como lo hice..:

     

    con EntityFramework:

    public ActionResult Test()
        { 
          DataEntities db = new DataEntities();
          ///var table2 = from m in db.Table2 select m;
          System.Data.Objects.ObjectParameter ac = new System.Data.Objects.ObjectParameter("mSG", typeof(string));
    
          for (int i = 1; i < 100000; i++)
          {
            int two = i + 1;
            db.INSERTAR(i.ToString(), two.ToString(), ac);
          }
          return Content(ac.Value.ToString());
        }
    

    con Linq to SQL:

    public ActionResult Test3()
        {
          Tabla2ContextLSDataContext _db = new Tabla2ContextLSDataContext();
          string ac = null;
    
          for (int i = 1; i < 100000; i++)
          {
            int two = i + 1;
            _db.INSERTAR(i.ToString(), two.ToString(), ref ac);
          }
          return Content(ac.Trim());
        }
    

    y con DataReader:

        public ActionResult Test2()
        {
       //   DataTable dt = new DataTable();
          string msg = "";
    	
          using (SqlConnection connection = new SqlConnection("Data Source=.\\SQLExpress;Integrated Security=true; AttachDbFilename=|DataDirectory|\\Database1.mdf;User Instance=true;"))
          using (SqlCommand command = new SqlCommand())
          {
            command.Connection = connection;
            command.CommandText = "INSERTAR";
    
            command.CommandType = System.Data.CommandType.StoredProcedure;
    
            command.Parameters.Add("@Nombre", System.Data.SqlDbType.Char, 10);
            command.Parameters.Add("@Prueba", System.Data.SqlDbType.Char, 10);
            command.Parameters.Add("@MSG", System.Data.SqlDbType.Char, 10);
            command.Parameters["@MSG"].Direction = System.Data.ParameterDirection.Output;
    
            connection.Open();
    
            for (int i = 1; i < 100000; i++)
            {
              int two = i + 1;
              command.Parameters["@Nombre"].Value = i.ToString();
              command.Parameters["@Prueba"].Value = two.ToString();  
              command.ExecuteNonQuery();
            }               
              msg = command.Parameters["@MSG"].Value.ToString();
    
            connection.Close();
    
          }
         
    
    
          return Content(msg + " DESDE Test2");
        }
    

    Gracias...

    • Tipo cambiado Eder Costa martes, 16 de octubre de 2012 13:21
    sábado, 27 de agosto de 2011 20:04

Todas las respuestas

  • Efectivamente, lo más rápido es insertar directamente con un ExecuteNonQuery de un SQLCommand. No hay que olvidar que, en última instania, los ORM tales como Entity Framework al final llaman internamente a un ExecuteNonQuery cuando van a grabar. Si llamas tú directamente al ExecuteNonQuery, te saltas toda la capa intermedia añadida por el ORM. Pero a cambio, por supuesto, pierdes todas las capacidades del ORM, es decir, no tienes el "mapeo objeto-relacional" sino que estás llamando directamente al modelo relacional para hacer el acceso a datos, sin que tengas nada que te haga los mapeos a los objetos.

     

    domingo, 28 de agosto de 2011 6:58