tag:blogger.com,1999:blog-649979524243914502024-03-14T08:04:54.977-05:00El Tavo = { c#, asp.net, MVC, WCF, y más}Error line 1: No existe una definición para el TavoAnonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.comBlogger75125tag:blogger.com,1999:blog-64997952424391450.post-22466782953003464742016-07-23T18:22:00.004-05:002016-07-23T18:28:26.433-05:00Introducción a EntityFramework Core<div style="text-align: justify;">
Como todos sabemos desde el año anterior Microsoft anunció una nueva versión del .Net Framework, llamado .Net Core, una versión del framework mucho más liviana y modular, diseñada para ser multiplataforma. Uno de los productos desarrollados a la par fue EntityFramework Core, una nueva versión del ORM de Microsoft mucho más liviana la cual incluye muchas de las características implementadas en <a href="http://www.eltavo.net/search/label/EntityFramework">EntityFramework 6.x</a> la última versión estable de este ORM.</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUb3TKpMHwTB_P9DwdhO-H32pMY4oQo0RoG84O0Ct5R32NgFFn3D-031D_kwoasuHcAHzF_oy5qy5o1mjNwowy0XpFddUyEWRMciOuictdWUlTmEMZExXSF-uz2SXH8gmTGDvjhjvnlYM/s1600/entity_image.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUb3TKpMHwTB_P9DwdhO-H32pMY4oQo0RoG84O0Ct5R32NgFFn3D-031D_kwoasuHcAHzF_oy5qy5o1mjNwowy0XpFddUyEWRMciOuictdWUlTmEMZExXSF-uz2SXH8gmTGDvjhjvnlYM/s1600/entity_image.png" /></a><br />
<div>
<br /></div>
<div style="text-align: justify;">
El pasado 27 de Junio fue anunciada por Microsoft la liberación de la primera versión estable del .Net Core Framework o .Net Core 1.0 y consigo la liberación de Asp.Net Core 1.0 y EntityFramework Core 1.0 liberación bastante esperada por todos debido al inicio de un nuevo Framework mucho más modular y multiplataforma.</div>
<div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
EntityFramework Core, es una versión multiplataforma, mucho más liviana y optimizada para la nube, en trabajo conjunto con Asp.Net Core, además de esto está pensado para realizar mapeos con múltiples motores de base de datos relaciones, así mismo como bases de datos no relacionales, como <a href="http://www.eltavo.net/search/label/DocumentDB">DocumentDB, </a> Azure Table Storage y Redis por ejemplo, si bien aún no tenemos estos providers en la versión actual de EF Core, se espera que sea incluida en futuras versiones.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div>
Entre algunas de las características ya disponibles en EF Core tenemos las siguientes:</div>
</div>
<div>
<ul>
<li>Fluent Api</li>
<li>DataAnnotations</li>
<li>RelationShips</li>
<li>Shadow State Properties</li>
<li>ChangeTraking</li>
<li>Optimistic Concurrency</li>
<li>Async SaveChanges</li>
</ul>
<div>
Y algunas características importantes que aún no están disponibles pero que están Backlog:</div>
</div>
<div>
<ul>
<li>Lazy loading</li>
<li>Creating model from DataBase with Wizard</li>
<li>Update Model From DataBase</li>
<li>Stored Procedure Mapping</li>
<li>Connection Resiliency</li>
</ul>
<div>
Si quieres observar el listado completo de características implementadas y características por implementar en EF Core, te invito a que observes su RoadMap en la siguiente página: <a href="https://github.com/aspnet/EntityFramework/wiki/Roadmap" target="_blank">EF Core RoadMap.</a></div>
</div>
<div>
<br /></div>
<div>
Otro tema importante a tener en cuenta es los proveedores de base de datos que actualmente soporta EntityFramework Core, que se mencionan a continuación:</div>
<div>
<ul>
<li>Microsoft Sql Server</li>
<li>SQLite</li>
<li>Postgres</li>
<li>Sql Server Compact edition</li>
<li>InMemory</li>
<li>DevArt has paid providers for MySQL, Oracle, and many other databases</li>
</ul>
<div>
Para terminar les recomiendo tener presente algunos Issues conocidos de EntityFramework Core, que aún no se han solucionado y se deben tener en cuenta, los cuales puedes encontrar en el siguiente link: <a href="https://github.com/aspnet/Home/releases/tag/1.0.0#known-issues" target="_blank">EntityFramework Core Known Issues</a></div>
</div>
<div>
<br /></div>
<div>
Es una gran noticia la liberación de .Net Core, Asp.Net Core y por supuesto EntityFramework Core, sin embargo es importante tener en cuenta que son tecnologías creadas desde inicio y no una evolución de las versiones full, dado esto son tecnologías que están en proceso de maduración y aún no cuentan con muchas características, por esto es importante documentarnos a la hora de usarlos para proyectos empresariales o productivos, en próximos artículos de esta serie de EF Core observaremos nuevas características y cambios importantes con respecto a la versión 6x</div>
<div>
<br /></div>
Y bueno amigos con esto damos por terminado este artículo de introducción a EntityFramework Core, espero les haya resultado interesante y de utilidad.<br />
<br />
No olvides darle me gusta mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
<br />
Saludos y buena suerte! Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-31829307279629454282016-04-17T18:45:00.001-05:002016-04-17T18:54:44.493-05:00No inicies desde cero, Yeoman te da una mano!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM39LsspcsfZSLWzcMN2Jm8FVuG5oHvRXi6d2RM6uv-YgBfFSxUotA1yvUDYCDQ9O5YcOfoStWbpHYIUYm9qzCYqHWdlZhEO2spo0uWT4u3ZPL2ZJZkEYG6BmUH6UL5lJfRpQC28OYKxU/s1600/Yeoman.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM39LsspcsfZSLWzcMN2Jm8FVuG5oHvRXi6d2RM6uv-YgBfFSxUotA1yvUDYCDQ9O5YcOfoStWbpHYIUYm9qzCYqHWdlZhEO2spo0uWT4u3ZPL2ZJZkEYG6BmUH6UL5lJfRpQC28OYKxU/s200/Yeoman.png" width="200" /></a><br />
<div style="text-align: justify;">
Para los desarrolladores es de suma importancia a la hora de iniciar un nuevo proyecto o la construcción de una nueva aplicación tener un punto de partida que nos indique una forma ideal de estructurar nuestro código y uso de buenas prácticas, particularmente los desarrolladores que solemos usar Visual Studio para la mayoría de nuestro proyectos estamos acostumbrados a encontrar este apoyo en las diversas plantillas o starters que VS nos ofrece, pero qué pasa si nos encontramos trabajando en un entorno diferente a Windows y no contamos con VS como IDE de desarrollo?</div>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWf-k0C6jL6zg0gSqGznm69B8Gp_EgDT6LukcIIwegUmS9wlUnNwY6rm6bIDo6NhVPwhvcqfJ_Kehci8A0E8vfb1Fkxuc0kAO0AX2wIbAPSZoSAt1OfXe0OurukM0OWBkS4h493DjixO8/s1600/bower-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWf-k0C6jL6zg0gSqGznm69B8Gp_EgDT6LukcIIwegUmS9wlUnNwY6rm6bIDo6NhVPwhvcqfJ_Kehci8A0E8vfb1Fkxuc0kAO0AX2wIbAPSZoSAt1OfXe0OurukM0OWBkS4h493DjixO8/s200/bower-logo.png" width="200" /></a><br />
<div style="text-align: justify;">
Pues una buena alternativa sin duda es el uso de Yeoman, una popular herramienta Open source de Scaffolding web, que cuenta con un amplio sistema de generadores, los cuales permiten obtener starters para diversos tipos de proyectos en diversas tecnologías que ofrecen un buen punto de partida, si quieres indagar un poco más sobre Yeoman te puedes remitir a su sitio oficial <a href="http://yeoman.io/" target="_blank">http://yeoman.io/</a> y aquí puedes encontrar su código fuente <a href="https://github.com/yeoman/yeoman" target="_blank">https://github.com/yeoman/yeoman</a></div>
<br />
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGM9vHQ3SKUlLWJeSYg70c_hy1b1DdKtCnhrqKSvIE7L3s6czDA58_T_NY_-nXem8xrPcrPppGt0ah9F6MlT-F3KnHhD60BDi8FEKYEtedijtUlM29MGy7RrdAHD7ZxQ87a-pNJPLH-4s/s1600/grunt.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGM9vHQ3SKUlLWJeSYg70c_hy1b1DdKtCnhrqKSvIE7L3s6czDA58_T_NY_-nXem8xrPcrPppGt0ah9F6MlT-F3KnHhD60BDi8FEKYEtedijtUlM29MGy7RrdAHD7ZxQ87a-pNJPLH-4s/s200/grunt.png" width="200" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Yeoman actualmente cuenta con 3.738 generadores, entre los cuales encontramos algunos soportados por el equipo de Yeoman y otros por la comunidad, en estos generadores podemos encontrar starters para Angular, Ionic, Asp.Net Core, BootStrap, React y muchos más. Una característica bien importante de Yeoman es que se apalanca del uso de un Task runner (Gulp, Grunt, etc) y un gestor de paquetes (Bower, npm, etc) para sacarle el mayor provecho, dado que a través de Bower por ejemplo se pueden descargar las dependencias que tienen los diferentes generadores para lograr correctamente y a través de Grunt se pueden ejecutar tareas de compilación, concatenación, minificación, servir la aplicación, etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora que ya conocemos un poco acerca de Yeoman, vamos a ver como lo podemos usar, empecemos por instalarlo:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En primer lugar vamos a instalar NodeJs, el cual puedes descargar de la siguiente página <a href="https://nodejs.org/en/" target="_blank">https://nodejs.org/en/</a> una vez lo estés instalando observarás que se instalará por defecto también npm, el gestor de paquetes de NodeJs, el cual nos permitirá instalar posteriormente, Yeoman, Bower y Grunt.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora usaremos la consola de npm para instalar Bower, que recordemos nos servirá para instalar las dependencias de los starters que usemos con Yeoman, para esto ejecutamos el siguiente comando:</div>
<div style="text-align: justify;">
<br /></div>
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; color: white; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; line-height: 24px; overflow: auto; padding: 1em; white-space: pre-wrap;"><code class="language-bash" data-lang="bash" style="background: none; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Consolas, Menlo, Courier, monospace; font-size: 1.1em; padding: 0px;"><span class="gp" style="box-sizing: border-box;">$ </span>npm install -g bower</code></pre>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora instalaremos Gulp, que es un Task Runner al igual que Grunt, podemos usar cualquiera de los dos, en este caso instalaremos Gulp, a través del siguiente comando:</div>
<div style="text-align: justify;">
<br /></div>
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ npm install --global gulp-cli</span></span></pre>
<br />
Y ahora a lo que vinimos, instalaremos Yeoman, a través del siguiente comando:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ npm install -g yo</span></span></pre>
<br />
Para nuestro ejemplo vamos a crear una aplicación Asp.Net Core, por lo cual vamos a descargar su generador correspondiente, para iniciar vamos a escribir el comando "yo" en la ventana de comandos de Windows, de esta forma se nos presentarán algunas opciones a ejecutar<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipw-XPguakQWr6KYr9bAH-nov6yT4KkZBKkOnDo5DyqerpPZ_UWulj9kU-e5f4RI3fAR75pnAVm2a57B9LoyVjVqW8KF0XbEtHC5aj_Kx7zJ-dd2YhkMXpuCPeP7oxpDKcB87TfFBX-HI/s1600/YeomanI.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipw-XPguakQWr6KYr9bAH-nov6yT4KkZBKkOnDo5DyqerpPZ_UWulj9kU-e5f4RI3fAR75pnAVm2a57B9LoyVjVqW8KF0XbEtHC5aj_Kx7zJ-dd2YhkMXpuCPeP7oxpDKcB87TfFBX-HI/s640/YeomanI.JPG" width="640" /></a></div>
<br />
Si elegimos la opción instalar un generador, posteriormente nos pedirá digitar alguna palabra clave del nombre del generador para que se busque y se instale, puedes observar todos los generadores existentes y buscar más amigablemente en la siguiente página <a href="http://yeoman.io/generators/" target="_blank">http://yeoman.io/generators/</a> Nosotros instalaremos directamente el generador de aplicaciones Asp.Net 5 a través del siguiente comando:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ npm install -g generator-aspnet</span></span></pre>
<br />
Una vez termine de instalar el generador procedemos a crear nuestra aplicación Asp.Net 5 a través de este, para esto ejecutamos el siguiente comando:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ yo aspnet</span></span></pre>
<br />
Para este generador en particular se nos preguntará que tipo de aplicación deseamos crear, aplicación de consola, Web, Web Api, etc<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRQOvLeV8eo7otMzqc-wVYPkZ4QdLGc_PeHRIHNFUkeGNwgm3yTeXNPpsPYjPjIXdJ40n24rFY6uJHT29xz-fWqNGQ8H5UgbGqzRP_WCuAWw6nw7x6v7Ce7jpIqavqQKlt8U4iivzUfpY/s1600/YeomanII.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="349" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRQOvLeV8eo7otMzqc-wVYPkZ4QdLGc_PeHRIHNFUkeGNwgm3yTeXNPpsPYjPjIXdJ40n24rFY6uJHT29xz-fWqNGQ8H5UgbGqzRP_WCuAWw6nw7x6v7Ce7jpIqavqQKlt8U4iivzUfpY/s640/YeomanII.JPG" width="640" /></a></div>
<br />
En nuestro caso seleccionaremos Web Application, y para finalizar debemos especificar el nombre que tendrá nuestra aplicación.<br />
<br />
Con esto Yeoman genera la estructura de nuestro proyecto, y nos sugiere ejecutar los siguientes comandos para posicionarnos en la aplicación, restaurar los paquetes o dependencias, compilar y ejecutar respectivamente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheiFYwhOPdP0n8atUisgydeVIXAMS7Gz3bNbd6T8GPhruIqUxY-I7CdyTNj2dQYDbuSC3LgYAtKrdjDU-fHxV90T3cXzINSRsfcIJFyTqNlZZKjSfe0cRFmQ6aiZ5nlqJ4nTadI7fQgpE/s1600/YeomanIII.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheiFYwhOPdP0n8atUisgydeVIXAMS7Gz3bNbd6T8GPhruIqUxY-I7CdyTNj2dQYDbuSC3LgYAtKrdjDU-fHxV90T3cXzINSRsfcIJFyTqNlZZKjSfe0cRFmQ6aiZ5nlqJ4nTadI7fQgpE/s640/YeomanIII.JPG" width="640" /></a></div>
<br />
Si tenemos Visual Studio instalado, podemos abrir el proyecto a través de este IDE y seguirlo trabajando a través de él, pero en caso de que no lo tengamos podemos optar por los comando sugeridos anteriormente.<br />
<br />
Como podemos ver en los comandos anteriores se hace uso de DNU y DNX, estos corresponden al .Net Execution Enviroment, que es el ambiente de ejecución que permite ejecutar las aplicaciones .Net Core, para lograr ejecutar estos comandos debemos instalar antes este entorno de ejecución, para eso usamos los siguiente comando, <a href="http://docs.asp.net/en/latest/getting-started/installing-on-mac.html#install-asp-net-5-from-the-command-line" target="_blank">te recomiendo este post si quieres tener un poco más de contexto</a>:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ dnvm upgrade -r coreclr</span></span></pre>
<br />
Ahora que tenemos el ambiente de ejecución, ejecutaremos el siguiente comando para restaurar los paquetes o dependencias:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ dnu restore</span></span></pre>
<br />
El siguiente comando para compilar el proyecto:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ dnu build</span></span></pre>
<br />
Y para terminar el siguiente comando para ejecutar nuestra aplicación en un servidor local<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ dnx web</span></span></pre>
<br />
Y veremos el siguiente mensaje que nos indica en que url está corriendo nuestra aplicación para que la podamos probar:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGtzwGstvvtDYZ_mzBRz44IQpo05rIKtrKt3flsO72xA2QZpTSvGOyZEX1gEbjJ70tHu3B5mhmUdkLkxRHj70aNI97snINLj9N3KOJJFFR0Um7qUh0KyKALhl8pmvLoTF53YfB0GLx_KU/s1600/YeomanIV.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGtzwGstvvtDYZ_mzBRz44IQpo05rIKtrKt3flsO72xA2QZpTSvGOyZEX1gEbjJ70tHu3B5mhmUdkLkxRHj70aNI97snINLj9N3KOJJFFR0Um7qUh0KyKALhl8pmvLoTF53YfB0GLx_KU/s640/YeomanIV.JPG" width="640" /></a></div>
<br />
Y si navegamos a través de un browser podremos ver nuestra aplicación corriendo con el starter por defecto de Asp.Net 5<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibcoBfg1PY1SsBBRx5_QxIkkC8rcPu8WXdFd5wa9bBkzpGHlqk3EYNwkwJpUnMyThYJ3kSWyBqIoklcyX6rIEt5xo9JF0F3hWVzQGo5NodD3Dqilij3xcPDexI0raD35IsEVsXZE8UXWI/s1600/YeomanV.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibcoBfg1PY1SsBBRx5_QxIkkC8rcPu8WXdFd5wa9bBkzpGHlqk3EYNwkwJpUnMyThYJ3kSWyBqIoklcyX6rIEt5xo9JF0F3hWVzQGo5NodD3Dqilij3xcPDexI0raD35IsEVsXZE8UXWI/s640/YeomanV.JPG" width="640" /></a></div>
<br />
<br />
Una vez tenemos nuestra aplicación Yeoman no nos deja solos en lo que viene, también a través de este podemos crear ítems específicos para nuestro proyecto, por ejemplo con el siguiente comando podríamos crear una nueva clase:<br />
<br />
<pre style="background: rgb(84, 55, 41); border-radius: 5px; box-sizing: border-box; overflow: auto; padding: 1em;"><span style="color: white; font-family: "consolas" , "menlo" , "courier" , monospace;"><span style="font-size: 17.6px; line-height: 24px; white-space: pre-wrap;">$ yo aspnet:Class ElTavoClase</span></span></pre>
<br />
Y bueno amigos con esto damos por terminado este artículo, sobre cómo usar Yeoman para iniciar nuestras aplicaciones, espero les haya resultado interesante y de utilidad.<br />
<br />
No olvides darle me gusta mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com5tag:blogger.com,1999:blog-64997952424391450.post-12373247463743389382016-04-03T21:50:00.000-05:002016-04-03T21:50:52.089-05:00Dapper vs EntityFramework, debo usar un MicroOrm o un Orm?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjspJnbKCXUCffPOmyIrkSprenWDKuJlAicekpuC6jv7Ma-p_F9CzM8uSFcOsfenRDzkta9OOrOL0WPzmjkydEgqTy4uF5i1GiyNDsWkS_kiqrFjDpDMz1d1LnlapfA_Z6SvPKP3_nYifE/s1600/database_1_256.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjspJnbKCXUCffPOmyIrkSprenWDKuJlAicekpuC6jv7Ma-p_F9CzM8uSFcOsfenRDzkta9OOrOL0WPzmjkydEgqTy4uF5i1GiyNDsWkS_kiqrFjDpDMz1d1LnlapfA_Z6SvPKP3_nYifE/s1600/database_1_256.png" /></a><br />
<div style="text-align: justify;">
En muchos de nuestros proyectos hemos usado un Orm para lograr mapear nuestro modelo de datos a nuestros objetos y estructura de clases de nuestra aplicación, logrando con esto resolver el acceso y persistencia de datos sin mucho esfuerzo y poder enfocarnos en lo que verdaderamente nos importa, el dominio del negocio.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<br />
<div style="text-align: justify;">
Los Orm han tomado mucha fuerza y actualmente son usados en la mayoría de aplicaciones dado las facilidades y bondades que ofrecen, Orms como Nhibernate, EntityFramework, Hibernate, Telerik Data Access, son ejemplos de Orms bastante populares y usados en la actualidad, debido a las facilidades que ofrecen y buenas prácticas y patrones que encapsulan.</div>
<div style="text-align: justify;">
<br /></div>
Pese a esto siempre se ha discutido con respecto al rendimiento que estos nos ofrecen y cómo pueden afectar el desempeño de nuestras aplicaciones, debido a las facilidades y funcionalidades que ofrecen se vuelven bastante robustos para preparar y acceder a la información. Por ejemplo EntityFramework está basado sobre la arquitectura de Ado.Net lo cual sugiere que tenemos una capa intermedia, que obtiene el resultado a través de los componentes de este y posteriormente mapea el resultado a un objeto de nuestra aplicación, este proceso sugiere algunos milisegundos más en cada transacción.<br />
<br />
Ahora, que pasa si tuviéramos una alternativa un poco más liviana y rápida que sacrifique algunas facilidades y características para garantizar el rendimiento en el acceso a datos? pues de esto se trata un MicroOrm, este nos permite realizar un mapeo de nuestro modelo relacional a objetos de nuestra aplicación, solo que lo hace de una forma más simple y sin algunas características como por ejemplo manejo de relaciones entre tablas, manejo de concurrencia, cargas por demanda, diseñador del modelo, etc.<br />
<br />
Entre los MicroOrm más famosos encontramos los siguientes:<br />
<ul>
<li>PetaPoco</li>
<li>Insight</li>
<li>NPoco</li>
<li><b>Dapper</b> (Se puede decir que este es el MicroOrm más conocido y usado, debido a que se ha comprobado que es el que mejor rendimiento tiene, tan solo un milisegundo más que una consulta directamente con Ado.Net, adicional este es el MicroOrm usado por el reconocido foro StackOverflow, para soportar su robusta arquitectura)</li>
</ul>
Ahora que ya conocemos que es un micro Orm y sabemos cuál es su principal diferencia con un Orm, vamos a ver cómo funciona y cómo es su implementación, para esto vamos a usar <a href="https://github.com/StackExchange/dapper-dot-net" target="_blank">Dapper</a>, y adicional vamos a realizar una serie de comparaciones de rendimiento y de codificación con EntityFramework.<br />
<br />
Para nuestro ejemplo vamos a usar la conocida base de datos Northwnd, la cual puedes descargar del siguiente enlace: <a href="https://northwinddatabase.codeplex.com/">https://northwinddatabase.codeplex.com/</a><br />
<br />
Posteriormente vamos a crear en Visual Studio un nuevo de proyecto de tipo consola y en la clase Program, vamos a empezar a codificar el ejemplo.<br />
<br />
Para iniciar vamos a abrir la consola del administrador de paquetes Nuget y vamos a ejecutar el siguiente comando para instalar el paquete de Dapper:<br />
<br />
<span style="background-color: #202020; color: #e2e2e2; font-family: "andale mono" , "lucida console" , monospace; font-size: 20.4px; line-height: 30.6px;">Install-Package Dapper -Version 1.42.0</span><br />
<br />
Y hacemos el Using del NameSpace <b>Dapper</b> en la clase Program, con esto se agregan una serie de métodos de extensión a la clase SqlConnection las cuales nos permiten usar el MicroOrm para interactuar con la base de datos.<br />
<br />
Para la conexión a la base de datos a través de Dapper solo necesitamos especificar la cadena de conexión, para esto crearemos una constante en clase Program en la cual la almacenaremos, para efectos de nuestro ejemplo vamos a usar cadenas mágicas en el código y no archivos de configuración, dado que esto no es relevante para el ejercicio:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">const</span> <span style="color: #569cd6;">string</span> Cadena <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"Initial Catalog=NORTHWND;Data Source=TAVOPC;Integrated Security=SSPI;"</span>;
</pre>
<br />
<b><span style="font-size: large;">Escenario de una consulta simple a una sola tabla</span></b><br />
<br />
Ahora vamos a codificar nuestro primer escenario, en el cual vamos a consultar en la tabla Ordenes, a través de Dapper y vamos a mapear el resultado a la entidad Orden (entidad creada por nosotros)<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> ConsultarOrdenesDapper()
{
<span style="color: #569cd6;">using</span> (<span style="color: #b8d7a3;">IDbConnection</span> db <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">SqlConnection</span>(Cadena))
{
<span style="color: #569cd6;">var</span> consulta <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">@"SELECT [OrderID] AS Id, [CustomerID] AS IdCliente, [EmployeeID] AS IdEmpledo,
[OrderDate] AS Fecha, [RequiredDate] AS FechaRequerida, [ShipCountry] AS Pais, [ShipCity] AS Ciudad
FROM [NORTHWND].[dbo].[Orders]"</span>;
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #57a64a;">// Se ejecuta la consulta.</span>
<span style="color: #569cd6;">var</span> ordenes <span style="color: #b4b4b4;">=</span> db<span style="color: #b4b4b4;">.</span>Query<<span style="color: #4ec9b0;">Orden</span>>(consulta);
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"Dapper.Net: </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> registros obtenidos en </span><span style="color: #80ff80;">{1}</span><span style="color: #d69d85;"> milisegundos."</span>, ordenes<span style="color: #b4b4b4;">.</span>Count(),
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
Como podemos ver es bastante sencillo usar Dapper, en este caso a través de la clase SqlConnection establecemos la conexión con la base de datos, y ejecutamos el método Query, especificando el tipo en el que queremos obtener el resultado de la consulta, cabe mencionar que el método Query no se encuentra en la clase SqlConnection por defecto, este es un método de extensión agregado por el Nuget de Dapper. Ahora invocaremos el método ConsultarOrdenesDapper desde el método Main de la clase program, y ejecutamos el programa para ver los resultados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ21YGYFFYDIy5FwCsyG0ZkC4pkSrF3rapXfLDXoTzcMg8gnkEFRalHdsq8cAJojqvXOlWHkufSUxg967HCudQCnOyrOmzN05ythhhQpDC5m8ReqqM1pnuWymN0jw9grw4X0z1LM1JCig/s1600/MicroOrmIII.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ21YGYFFYDIy5FwCsyG0ZkC4pkSrF3rapXfLDXoTzcMg8gnkEFRalHdsq8cAJojqvXOlWHkufSUxg967HCudQCnOyrOmzN05ythhhQpDC5m8ReqqM1pnuWymN0jw9grw4X0z1LM1JCig/s640/MicroOrmIII.JPG" width="640" /></a></div>
<br />
Como podemos apreciar obtenemos un resultado bastante óptimo de 856 registros en 4 milisegundos, ahora en cuánto tiempo resolverá EntityFramework esta consulta? pues vamos a averiguarlo.<br />
<br />
Para crear nuestro modelo conceptual a través de EntityFramework, vamos a usar el enfoque "Code First From DataBase" el cual permite usar CodeFirst con una base de datos existente y crea el contexto y las entidades a partir de ella, observa aquí un tutorial detallado acerca de cómo usar este enfoque: <a href="http://www.eltavo.net/2014/04/entityframework-nueva-funcionalidad.html" target="_blank">CodeFirst From DataBase</a><br />
<br />
Ahora que ya tenemos nuestro contexto vamos a codificar la misma consulta que realizamos con Dapper, pero esta vez la ejecutaremos a través de EntityFramework.<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> ConsultarOrdenesEf()
{
<span style="color: #569cd6;">using</span> (<span style="color: #569cd6;">var</span> contexto <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">NorthwndModel</span>())
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #569cd6;">var</span> ordenes <span style="color: #b4b4b4;">=</span> contexto<span style="color: #b4b4b4;">.</span>Orders<span style="color: #b4b4b4;">.</span>ToList();
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"EntityFramework: </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> registros obtenidos en </span><span style="color: #80ff80;">{1}</span><span style="color: #d69d85;"> milisegundos."</span>, ordenes<span style="color: #b4b4b4;">.</span>Count,
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
Ahora de igual forma vamos a invocar el método ConsultarOrdenesEf desde el método main de la clase Program, y ejecutamos de nuevo la aplicación para ver el resultado:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYma4GPTCtnx3y7G_OdGhC-XfkmPCn522vpAedayIllGUIM90zO0aOKl7rC0AB3bbl1ocao0X1691ZXF6DuDMNCaZ2QPJerTZIQ-u0FbGKOzPhecpOlxjPH_FUOqdF1Ac4jHDaqx9ZXc/s1600/MicroOrmIV.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYma4GPTCtnx3y7G_OdGhC-XfkmPCn522vpAedayIllGUIM90zO0aOKl7rC0AB3bbl1ocao0X1691ZXF6DuDMNCaZ2QPJerTZIQ-u0FbGKOzPhecpOlxjPH_FUOqdF1Ac4jHDaqx9ZXc/s640/MicroOrmIV.JPG" width="640" /></a></div>
<br />
Pues la diferencia es bastante grande de 6 milisegundos de Dapper a 95 milisegundos de EntityFramework, sin lugar a dudas es una diferencia significativa, si bien 95 milisegundos siguen siendo poco esos milisegundos van sumando en cada transacción, y en una aplicación de alta demanda por ejemplo sí que se notarían y afectarían muy negativamente el rendimiento.<br />
<br />
Ahora que hemos realizado este primer escenario comparativo podemos concluir que definitivamente el rendimiento de Dapper es muy superior al de EntityFramework, dado que como había mencionado antes el MicroOrm es muy rápido y liviano, por el contrario el Orm es bastante robusto y ofrece muchas más extensiones y funcionalidades que penalizan un poco el rendimiento. Sin embargo si analizamos y comparamos detenidamente el código de cada una de las implementaciones podemos decir que la implementación de EntityFramework es mucho más limpia, trazable y mantenible, otro aspecto muy importante en nuestras aplicaciones. Adicional vale la pena considerar el escenario en el cual trabajamos con tablas relacionadas, escenario que encontraremos en todas nuestras aplicaciones y que veremos a continuación.<br />
<br />
<span style="font-size: large;"><b>Escenario de consulta a dos tablas relacionadas</b></span><br />
<br />
Sin duda una de esas características que brilla por su ausencia en los MicroOrm con respecto a los Orm, es el manejo de relaciones entre entidades de una forma sencilla y objetual, obviamente el Micro Orm no tiene esto entre sus prioridades, pero si que hace falta. Para plantear este escenario vamos a realizar una consulta en la tabla ordenes y en la tabla ordenes detalle, en un escenario Eaguer, es decir donde necesitamos obtener la información en una sola consulta a la base de datos y no por demanda, vemos como sería la implementación con Dapper:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> ConsultarOrdenesDetallesDapper()
{
<span style="color: #569cd6;">var</span> consulta <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">@"SELECT a.[OrderID] AS Id
,a.[CustomerID] AS IdCliente
,a.[OrderDate] AS Fecha
,b.[ProductID] AS IdProducto
,b.[UnitPrice] AS Precio
,b.[Quantity] AS Cantidad
,b.[Discount] AS Descuento
FROM [NORTHWND].[dbo].[Order Details] b
INNER JOIN [NORTHWND].[dbo].[Orders] a
ON a.OrderID = b.OrderID;"</span>;
<span style="color: #569cd6;">using</span> (<span style="color: #b8d7a3;">IDbConnection</span> db <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">SqlConnection</span>(Cadena))
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #57a64a;">// Se ejecuta la consulta.</span>
<span style="color: #569cd6;">var</span> ordenesDetalle <span style="color: #b4b4b4;">=</span> db<span style="color: #b4b4b4;">.</span>Query<<span style="color: #4ec9b0;">DetalleOrden</span>>(consulta);
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"Dapper.Net: </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> registros obtenidos en </span><span style="color: #80ff80;">{1}</span><span style="color: #d69d85;"> milisegundos."</span>,
ordenesDetalle<span style="color: #b4b4b4;">.</span>Count(), stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
De la implementación anterior podemos observar que se hace una consulta involucrando las dos tablas y se traen todos los registros de ambas, es decir se repiten los registros de la tabla ordenes por cada registro asociado en la tabla ordenesDetalle, y debido a esto se creó la entidad DetalleOrden, lo cual es una implementación que no nos permite orientar correctamente a objetos, ya que deberíamos tener la entidad orden y la entidad detalle separadas y cargarlas con la data, esto se debe a que el MicroOrm no permite manejar las relaciones y esta es una solución al escenario que planteamos de carga total. Ahora veamos como logramos la misma implementación pero usando EntityFramework.<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> ConsultarOrdenesDetallesEf()
{
<span style="color: #569cd6;">using</span> (<span style="color: #569cd6;">var</span> contexto <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">NorthwndModel</span>())
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #569cd6;">var</span> ordenesDetalle <span style="color: #b4b4b4;">=</span> contexto<span style="color: #b4b4b4;">.</span>Orders<span style="color: #b4b4b4;">.</span>Include(<span style="color: #d69d85;">"Order_Details"</span>)<span style="color: #b4b4b4;">.</span>ToList();
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"EntityFramework: </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> registros obtenidos en </span><span style="color: #80ff80;">{1}</span><span style="color: #d69d85;"> milisegundos."</span>,
ordenesDetalle<span style="color: #b4b4b4;">.</span>Count, stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
De nuevo podemos observar a simple vista que la implementación con EntityFramework es mucho más limpia y orientada a objetos, hacemos una consulta sobre la tabla Ordenes y especificamos que se incluyan los datos de la tabla relacionada o propiedad de navegación Order_Details, de esta forma se obtienen los registros:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLPyqXC_5jXdLymDqllNLjQAZ-XSc4EO0EgpPLL4Krmn42IpwFQJfHFULZEPlmTFrLn73MhYUURiFDM3_X_-G-xyrKZBT15238Nsd6dpEmee9jrxkSMDFlAUqkJ7nUhI1FE1S6Qm9Nqi8/s1600/MicroOrmV.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLPyqXC_5jXdLymDqllNLjQAZ-XSc4EO0EgpPLL4Krmn42IpwFQJfHFULZEPlmTFrLn73MhYUURiFDM3_X_-G-xyrKZBT15238Nsd6dpEmee9jrxkSMDFlAUqkJ7nUhI1FE1S6Qm9Nqi8/s400/MicroOrmV.JPG" width="400" /></a></div>
<br />
Todos los datos en sus respectivas entidades de una forma objetual, ahora veamos el rendimiento de cada de una de las implementaciones:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZRRCja1UWlfw4yNK2xsAOa3M5Y1Iw1EQwa44nBRA2zSyKsd9xK3_QhzFoUNXjplGleWje47xppZaZCDmz9aFOuYX-67ykfcaakyEhUGjBJuoNWdGQBy-RzsxEyMHjvKuPfmrroA9xBrs/s1600/MicroOrmVI.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZRRCja1UWlfw4yNK2xsAOa3M5Y1Iw1EQwa44nBRA2zSyKsd9xK3_QhzFoUNXjplGleWje47xppZaZCDmz9aFOuYX-67ykfcaakyEhUGjBJuoNWdGQBy-RzsxEyMHjvKuPfmrroA9xBrs/s640/MicroOrmVI.JPG" width="640" /></a></div>
<br />
Sigue existiendo una diferencia abismal en el rendimiento de las consultas, y ahora que EntityFramework está gestionando las relaciones ha aumentado sustancialmente, dado que debe mapear las entidades y cada registro de las entidades de una forma anidada.<br />
<br />
<b><span style="font-size: large;">Escenario de inserción en una sola tabla</span></b><br />
<br />
Ahora vamos a ver un par de escenarios en los cuales no consultaremos información si no que la guardaremos, para observar cómo se comportan tanto el MicroOrm como el Orm, veamos la implementación para Dapper y para EntityFramework:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> InsertarOrdenDapper()
{
<span style="color: #569cd6;">var</span> consulta <span style="color: #b4b4b4;">=</span>
<span style="color: #d69d85;">$@"INSERT INTO [NORTHWND].[dbo].[Orders] (CustomerID, OrderDate)
VALUES ('VINET', '</span>{<span style="color: #4ec9b0;">DateTime</span><span style="color: #b4b4b4;">.</span>Now<span style="color: #b4b4b4;">.</span>ToString(<span style="color: #d69d85;">"yyyy-MM-dd"</span>)}<span style="color: #d69d85;">');"</span>;
<span style="color: #569cd6;">using</span> (<span style="color: #b8d7a3;">IDbConnection</span> db <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">SqlConnection</span>(Cadena))
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #57a64a;">// Se ejecuta la instrucción.</span>
db<span style="color: #b4b4b4;">.</span>Execute(<span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">CommandDefinition</span>(consulta));
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"Dapper.Net: un registro insertado en </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> milisegundos."</span>,
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> InsertarOrdenEf()
{
<span style="color: #569cd6;">using</span> (<span style="color: #569cd6;">var</span> contexto <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">NorthwndModel</span>())
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #569cd6;">var</span> orden <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Order</span>
{
CustomerID <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"VINET"</span>,
OrderDate <span style="color: #b4b4b4;">=</span> <span style="color: #4ec9b0;">DateTime</span><span style="color: #b4b4b4;">.</span>Now
};
contexto<span style="color: #b4b4b4;">.</span>Orders<span style="color: #b4b4b4;">.</span>Add(orden);
contexto<span style="color: #b4b4b4;">.</span>SaveChanges();
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"EntityFramework: un registro insertado en </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> milisegundos."</span>,
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
Como podemos ver dos implementaciones muy sencillas en Dapper y en EntityFramework para insertar un registro, ahora comparemos el rendimiento de ambas implementaciones:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO1MvlEWrwvS6BO4taekR7VHyFkYSTPasn8QmheGFEtu9d9hRAmecuFgml5w8vGzyThEyHPhHNFAxQ8rWZj2gdm9rFROsfaOq9UASocAmEy1o-4A2Ig6pi6sc1Rf1JGAEu0COQ9fMjNco/s1600/MicroOrmVII.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO1MvlEWrwvS6BO4taekR7VHyFkYSTPasn8QmheGFEtu9d9hRAmecuFgml5w8vGzyThEyHPhHNFAxQ8rWZj2gdm9rFROsfaOq9UASocAmEy1o-4A2Ig6pi6sc1Rf1JGAEu0COQ9fMjNco/s640/MicroOrmVII.JPG" width="640" /></a></div>
<br />
En este escenario de inserción de un solo registro nos damos cuenta que en este aspecto la diferencia de rendimiento entre Dapper y EntityFramework no es tan grande, solo 7 milisegundos una diferencia en tiempo realmente pequeña.<br />
<br />
<b><span style="font-size: large;">Escenario de inserción en dos tablas relacionadas</span></b><br />
<br />
Para terminar la comparación entre Dapper y EntityFramework vamos a ver el último escenario en el cual vamos a insertar información en dos tablas relacionadas, veamos entonces como es el código a implementar para cada tecnología:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> InsertarOrdenDetalleDapper()
{
<span style="color: #569cd6;">var</span> consulta <span style="color: #b4b4b4;">=</span>
<span style="color: #d69d85;">$@"INSERT INTO [NORTHWND].[dbo].[Orders] (CustomerID, OrderDate)
VALUES ('VINET', '</span>{<span style="color: #4ec9b0;">DateTime</span><span style="color: #b4b4b4;">.</span>Now<span style="color: #b4b4b4;">.</span>ToString(<span style="color: #d69d85;">"yyyy-MM-dd"</span>)}<span style="color: #d69d85;">') select SCOPE_IDENTITY();"</span>;
<span style="color: #569cd6;">using</span> (<span style="color: #b8d7a3;">IDbConnection</span> db <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">SqlConnection</span>(Cadena))
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #57a64a;">// Se almacena la orden y se obtiene su Id Identity.</span>
<span style="color: #569cd6;">var</span> idOrden <span style="color: #b4b4b4;">=</span> (<span style="color: #569cd6;">int</span>)db<span style="color: #b4b4b4;">.</span>Query<<span style="color: #569cd6;">decimal</span>>(consulta)<span style="color: #b4b4b4;">.</span>First();
consulta <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">$@"INSERT INTO [NORTHWND].[dbo].[Order Details]
VALUES (</span>{idOrden}<span style="color: #d69d85;">, 41, 20, 100, 0);"</span>;
db<span style="color: #b4b4b4;">.</span>Execute(<span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">CommandDefinition</span>(consulta));
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"Dapper.Net: registros relacionados insertados en </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> milisegundos."</span>,
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: "consolas"; font-size: 13;"><span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> InsertarOrdenDetalleEf()
{
<span style="color: #569cd6;">using</span> (<span style="color: #569cd6;">var</span> contexto <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">NorthwndModel</span>())
{
<span style="color: #569cd6;">var</span> stopwatch <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Stopwatch</span>();
stopwatch<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #569cd6;">var</span> orden <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Order</span>
{
CustomerID <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"VINET"</span>,
OrderDate <span style="color: #b4b4b4;">=</span> <span style="color: #4ec9b0;">DateTime</span><span style="color: #b4b4b4;">.</span>Now,
Order_Details <span style="color: #b4b4b4;">=</span>
{
<span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Order_Detail</span>
{
ProductID <span style="color: #b4b4b4;">=</span> <span style="color: #b5cea8;">41</span>,
UnitPrice <span style="color: #b4b4b4;">=</span> <span style="color: #b5cea8;">20</span>,
Quantity <span style="color: #b4b4b4;">=</span> <span style="color: #b5cea8;">100</span>,
Discount <span style="color: #b4b4b4;">=</span> <span style="color: #b5cea8;">0</span>
}
}
};
contexto<span style="color: #b4b4b4;">.</span>Orders<span style="color: #b4b4b4;">.</span>Add(orden);
contexto<span style="color: #b4b4b4;">.</span>SaveChanges();
stopwatch<span style="color: #b4b4b4;">.</span>Stop();
System<span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>WriteLine(<span style="color: #d69d85;">"EntityFramework: registros relacionados insertados en </span><span style="color: #80ff80;">{0}</span><span style="color: #d69d85;"> milisegundos."</span>,
stopwatch<span style="color: #b4b4b4;">.</span>ElapsedMilliseconds);
}
}</pre>
<br />
Como podemos observar en este último escenario para EntityFramework creamos un solo objeto, especificando la información para la entidad padre y también para para la propiedad de navegación y EntityFramework se encarga de ejecutar las dos instrucciones de inserción, por el contrario con Dapper se debe ejecutar en primera instancia la instrucción para la tabla padre y obtener su Id, para posteriormente ejecutar la instrucción de la tabla relacionada, ahora observemos el desempeño de ambas implementaciones:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLdsqJAXuY1UGogMijXjTWce6afIy3aotm0K26_xx-X9ncxCzmRNCN2_vBG47bNiHRw5roiRYfZkmrbmJAiNOI5DPylnLISQzQYIVXN4NmVE8xgo7gkMWjYfGhk7yVsm-4Kvx7KyFRBbQ/s1600/MicroOrmVIII.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLdsqJAXuY1UGogMijXjTWce6afIy3aotm0K26_xx-X9ncxCzmRNCN2_vBG47bNiHRw5roiRYfZkmrbmJAiNOI5DPylnLISQzQYIVXN4NmVE8xgo7gkMWjYfGhk7yVsm-4Kvx7KyFRBbQ/s640/MicroOrmVIII.JPG" width="640" /></a></div>
<br />
Como en el escenario anterior vemos que la diferencia no es muy significativa, cuando se trata de operaciones de inserción. Dados los anteriores escenarios podríamos concluir que Dapper tiene un rendimiento muy superior a EntityFramework en cuanto a consulta de datos se refiere, sin embargo en operaciones de inserción tienen un rendimiento muy similar. También podemos concluir que usando un Orm podemos lograr implementaciones mucho más limpias y objetuales y un código más mantenible.<br />
<br />
En resumidas cuentas podemos concluir que los Micro Orm nos permiten practicidad, simplicidad y óptimo rendimiento, sacrificando un poco la mantenibilidad y orientación a objetos, mientras que los Orm nos permiten mejor mantenibilidad y orden sacrificando un poco el rendimiento, elegir uno u otro siempre dependerá del escenario que estemos resolviendo y según lo requieran nuestro atributos de calidad, recordemos que en el desarrollo de software no existen las balas de plata, y ambas tecnologías pueden ser muy válidas en determinados escenarios.<br />
<br />
Y bueno amigos con esto damos por terminado el artículo, espero que esta comparación entre Dapper y EntityFramework les haya resultado interesante y de utilidad.<br />
<br />
El código fuente lo puedes descargar <a href="https://github.com/Eltavo/DapperVsEntityFramework" target="_blank">de mi repositorio en GitHub</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/Eltavo/DapperVsEntityFramework" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Y9AROpaPA1ZtD56tQBYebhb_x9hizqUy-vV4jE7NveuhXTZaTXTEIM2nwGKlyK8YvhdgD06Sgs9LHRhgpMhgYm1vAC3m1Diy9_QwH7y3JjBVIozJcwTR4hhW7wRz-y4vzt0Cz1PptSM/s200/GitHubNinja.jpg" width="200" /></a></div>
<br />
<br />
No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br /><br /><div>
Saludos, y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com17tag:blogger.com,1999:blog-64997952424391450.post-91314327950506344712016-02-29T23:06:00.000-05:002016-02-29T23:06:04.299-05:00Creando un BackEnd con EntityFramework Core y Asp.Net Web Api<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZ4JJarK6nEIKPBzLVLa-RxDmL1uJF-FIg5t7CcBPyamrIhcaDrS-dUoC2CyGZTUR8Xs4PQJfpsSMyiQjILRvxkLEBFrN6zxVaaxq6TOh-38sGsk-MsvkYhuEZwmkNwqmIaW98gnxPZ0/s1600/entity_image.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNZ4JJarK6nEIKPBzLVLa-RxDmL1uJF-FIg5t7CcBPyamrIhcaDrS-dUoC2CyGZTUR8Xs4PQJfpsSMyiQjILRvxkLEBFrN6zxVaaxq6TOh-38sGsk-MsvkYhuEZwmkNwqmIaW98gnxPZ0/s200/entity_image.png" width="200" /></a><br />
<div style="text-align: justify;">
Como todos sabemos desde el año anterior Microsoft anunció una nueva versión del .Net Framework, llamado .Net Core, una versión del framework mucho más liviana y modular, diseñada para ser multiplataforma. Uno de los productos desarrollados a la par fue EntityFramework Core, una nueva versión del ORM de Microsoft mucho más liviana la cual incluye muchas de las características implementadas en <a href="http://www.eltavo.net/search/label/EntityFramework">EntityFramework 6.x</a> la última versión estable de este ORM, ya que EF Core aún se encuentra en Pre-Release.</div>
<br />
<br />
<span style="text-align: justify;">EntityFramework Core, es una versión mucho más liviana y optimizada para la nube, en trabajo conjunto con Asp.Net Core, además de esto está pensado para realizar mapeos con múltiples motores de base de datos relaciones, así mismo como bases de datos no relacionales, como <a href="http://www.eltavo.net/search/label/DocumentDB">DocumentDB </a>por ejemplo, si bien aún no tenemos esta característica en la versión actual de EF Core, se espera que sea incluida en futuras versiones.</span><br />
<div style="text-align: justify;">
<br /></div>
En la versión Pre-Release de EF Core encontramos características como el uso del <a href="http://www.eltavo.net/search/label/CodeFirst">enfoque CodeFirst</a>, relaciones a través de propiedades de navegación, creación del modelo usando convenciones, Shadow properties, que es una nueva característica bien interesante y la cual veremos más adelante en este blog, Changes Traking, concurrencia optimista, transacciones relaciones, entre otras características con las cuales estamos familiarizados y esperamos de cualquier ORM que usemos.<br />
<br />
Entre futuras características a implementar en EF Core tenemos el uso de los famosos <a href="http://www.eltavo.net/2014/01/entityframework-configurando-nuestras.html">DataAnnotations</a>, Queries sobre las propiedades de navegación, estabilización de soporte para multiplataforma, auditoria de operaciones, conexión y mapeo para <a href="http://www.eltavo.net/search/label/DocumentDB">DocumentDB</a>, entre otras características.<br />
<br />
Ahora que conocemos un poco EntityFramework Core, vamos a observar un HOL o tutorial en el cual desarrollaremos un BackEnd que use EntityFramework Core como ORM además de las siguientes tecnologías:<br />
<ul>
<li><b>Microsoft Azure Sql Db:</b> Como base de datos relacional en la nube, para almacenar los datos</li>
<li><b>EntityFramework Core:</b> Como ORM para persistencia y acceso a datos</li>
<li><b>Asp.Net Web Api:</b> Como marco de trabajo para la creación de servicios Http</li>
<li><b>Telerik Fiddler:</b> Como cliente para probar nuestros servicios</li>
</ul>
<div>
Ahora sí, manos a la obra, ingresa al siguiente <a href="https://github.com/Ninja-Labs/azure/blob/master/6.%20WebApps%20MVC%20Core%20and%20Entity%20Framework/Lab%201/README.md" target="_blank">link, en el cual encontrarás el paso a paso de como implentar el BackEnd.</a></div>
<div>
<br /></div>
Y puedes descargar los fuentes de la siguiente ruta: <a href="https://github.com/Ninja-Labs/azure/tree/master/6.%20WebApps%20MVC%20Core%20and%20Entity%20Framework/Lab%201/Fuentes/NinjaLab.Azure">Fuentes</a><br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/Ninja-Labs/azure/tree/master/6.%20WebApps%20MVC%20Core%20and%20Entity%20Framework/Lab%201/Fuentes/NinjaLab.Azure"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHINAbHKLpTaOYnjCOeFOILk8KwUDy0Lr3RAUr6Lw4Isxnd-Ta61bAThQABAK6ApvqO2biXd2KTiFI81KPHnCUkADhZ3BJRHNzsac1SEfxopFMS5HhAyIPbTOGRwvY_URxXZdEHAqglQ/s200/GitHubNinja.jpg" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Espero este artículo sea de utilidad y No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
<br />
<br />
Saludos, y buena suerte!<br />
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com2tag:blogger.com,1999:blog-64997952424391450.post-61566669845200880462016-01-11T17:25:00.000-05:002016-01-11T17:32:47.923-05:00Creando mi propio reproductor multimedia con Html5Como todos sabemos una de las grandes características que incorpora Html5 es el soporte nativo para reproducción de archivos multimedia, es decir audio y vídeo sin necesidad de usar plugins de terceros, que si bien hay algunos son bastante buenos y usados de una forma u otra nos ocasionaban algunos problemas de compatibilidad y cosas de este tipo.<br />
<br />
Ahora Html5 nos ofrece la posibilidad de lograr embeber en nuestras aplicaciones audio y vídeo de una forma nativa y estándar, lo que implica una implementación con mayor facilidad y portabilidad.<br />
<br />
El año anterior tuve la oportunidad de participar como speaker en el evento Microsoft DevCamp promovido por Microsoft Colombia, en cabeza de <a href="https://juank.io/" target="_blank">Juan Carlos Ruiz más conocido como Juank Ruiz</a>, en esta oportunidad dicté un Hands on Lab (HOL) de Html5 multimedia, en el cual al final de la sesión logramos construir un reproductor multimedia como este:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzEgpwFIPA4-o1PydYRoWGeaWYpo3yLhyWpWCzIflxF0YrGFHsovRVHSs62Rmv_pHMvCkB6txhp9MptIvfwltfxTnt8sV9Xpn0O7sEiJW7GVv75TUo4haO3slffST4fkg1isp161s68PM/s1600/1-ResultadoFinal.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzEgpwFIPA4-o1PydYRoWGeaWYpo3yLhyWpWCzIflxF0YrGFHsovRVHSs62Rmv_pHMvCkB6txhp9MptIvfwltfxTnt8sV9Xpn0O7sEiJW7GVv75TUo4haO3slffST4fkg1isp161s68PM/s640/1-ResultadoFinal.JPG" width="640" /></a></div>
<br />
Para construir este reproductor usamos herramientas como:<br />
<br />
<ul>
<li>Html5, como tecnología base, estructura semántica y controles multimedia.</li>
<li>BootStrap, para mejorar la experiencia del usuario y habilitar responsive design.</li>
<li>Font Awesome, para incorporar íconos amigables para el usuario.</li>
<li>Visual Studio Code, como IDE de desarrollo.</li>
</ul>
<div>
Ahora para observar el paso a paso para implementar el reproductor lo puedes encontrar en la siguiente ruta: <a href="https://github.com/Ninja-Labs/edge/blob/master/2.%20Evitar%20el%20uso%20de%20plugins%20utilizando%20HTML5/HOL.A/lab.md" target="_blank">Paso a paso</a><span id="goog_1599040913"></span><span id="goog_1599040914"></span><a href="https://www.blogger.com/"></a></div>
<div>
<br /></div>
<div>
Y puedes descargar los fuentes de la siguiente ruta: <a href="https://github.com/Ninja-Labs/edge/tree/master/2.%20Evitar%20el%20uso%20de%20plugins%20utilizando%20HTML5/HOL.A" target="_blank">Fuentes</a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/Ninja-Labs/edge/tree/master/2.%20Evitar%20el%20uso%20de%20plugins%20utilizando%20HTML5/HOL.A" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHINAbHKLpTaOYnjCOeFOILk8KwUDy0Lr3RAUr6Lw4Isxnd-Ta61bAThQABAK6ApvqO2biXd2KTiFI81KPHnCUkADhZ3BJRHNzsac1SEfxopFMS5HhAyIPbTOGRwvY_URxXZdEHAqglQ/s200/GitHubNinja.jpg" width="200" /></a><span id="goog_1599040932"></span><span id="goog_1599040933"></span><a href="https://www.blogger.com/"></a></div>
<div>
Espero este artículo sea de utilidad y No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a></div>
<div>
<br /></div>
<div>
Saludos, y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com2tag:blogger.com,1999:blog-64997952424391450.post-27528288720990752042015-09-20T11:26:00.002-05:002015-09-20T11:27:54.559-05:00Presentación: Introducción a Microsoft AzureHola amigos, hace un par de días tuve la oportunidad de dictar una introducción a Microsoft Azure, ya que fui invitado por parte de la universidad de Medellín, más específicamente por la rama estudiantil IEEE, aquí les comparto la presentación de mi charla y espero sea de utilidad.
<br />
<br />
<iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//es.slideshare.net/slideshow/embed_code/key/yfrlAWR1boSC0a" width="700"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-80258276837042123702015-05-11T12:08:00.000-05:002015-05-11T12:08:00.368-05:00Administrando documentos en DocumentDB<a href="http://www.eltavo.net/2015/04/administrando-colecciones-documentdb.html" target="_blank">En el artículo anterior</a> observamos cómo administrar las colecciones de nuestra base de datos a través del portal de <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Azure</a>, de una forma muy sencilla y amigable, recordemos que las colecciones nos permiten agrupar nuestros documentos de una manera lógica y administrarlos con mucha más facilidad, y precisamente de eso se trata este artículo de cómo administrar nuestros documentos a través del portal de <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Azure</a>.<br />
<br />
Para iniciar como es de costumbre abrimos el portal de <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Azure </a>con nuestra cuenta asociada, seleccionamos la cuenta previamente creada y en su interior seleccionamos la base de datos con la que estemos trabajando, posteriormente elegimos alguna de las colecciones existentes, y ahora si iniciamos a administrar los documentos de la colección.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOZ_ZvU9oeE0psTGyPbtbtdRr2ZeNmiwW_gVh32A2xWPNmCZWiGU0AQBZ0QvRr6o-q0mh4oMevAlF71yjRzceS9lngJV7-W4zD_Q3GZpHDXSLDz2sqmFMhhXOZiFzTRlCGBB7MIpifao/s1600/DocumentDBDocumentosI.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOZ_ZvU9oeE0psTGyPbtbtdRr2ZeNmiwW_gVh32A2xWPNmCZWiGU0AQBZ0QvRr6o-q0mh4oMevAlF71yjRzceS9lngJV7-W4zD_Q3GZpHDXSLDz2sqmFMhhXOZiFzTRlCGBB7MIpifao/s1600/DocumentDBDocumentosI.PNG" width="596" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQFIwdQUxeTeG-cAwAwvj31M43WOs2xquSlUjvyCTZl03eSWm9Sv10ah_8vyQtcxsdb3_FOOMVZthX-wqKwwkuhwdGwiUpcItYJcm2ZodZJdj6hT_L6W9O-TgQKrQQCtBa7d5KuSHm6oE/s1600/DocumentDBDocumentosII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQFIwdQUxeTeG-cAwAwvj31M43WOs2xquSlUjvyCTZl03eSWm9Sv10ah_8vyQtcxsdb3_FOOMVZthX-wqKwwkuhwdGwiUpcItYJcm2ZodZJdj6hT_L6W9O-TgQKrQQCtBa7d5KuSHm6oE/s1600/DocumentDBDocumentosII.PNG" width="640" /></a></div>
<br />
Como podemos ver en las imágenes anteriores al igual que para las bases de datos y las colecciones, para los documentos también tenemos opciones para monitorear las peticiones realizadas, el almacenamiento y el nivel de precios, adicional contamos con las opciones para desarrolladores, como lo son el explorador de documentos, que recordemos nos permite ver los documentos existentes en las diferentes colecciones y el explorador de consultas que nos permite realizar consultas detalladas sobre cualquier elemento de la base de datos.<br />
<br />
Y en la parte superior izquierda contamos con cuatro opciones las cuales nos permiten propiamente administrar nuestros documentos, veamos de qué se trata cada una de ellas:<br />
<br />
<b>Agregar documento:</b> A través de esta opción podemos agregar a una colección un archivo Json existente en nuestro disco, tan solo debemos seleccionar la ubicación del archivo y listo, de esta forma quedará almacenado en nuestra colección y por ende en la base de datos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvwjnYdxIqHDoVPOgY_Cs9ACW3Cza-uckMPYnFPdckLl9zgoc8VfRU5CC0mIJJ09S6dxnNg6-13xzrAUA-RFr6fUX3C_5mMYF3rSULW4NN-kLKhw1VxMbgBChG88D4HPN8TsD-yXzXlEg/s1600/DocumentDBDocumentosIII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvwjnYdxIqHDoVPOgY_Cs9ACW3Cza-uckMPYnFPdckLl9zgoc8VfRU5CC0mIJJ09S6dxnNg6-13xzrAUA-RFr6fUX3C_5mMYF3rSULW4NN-kLKhw1VxMbgBChG88D4HPN8TsD-yXzXlEg/s1600/DocumentDBDocumentosIII.PNG" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimPHmAZpiG15Gt4rH7dBM8-uINdoknKL_WiB8PVU3bqDJwqhsJLErgZB7wdYLtbrOD9IvBw3bQUmrATjXCWflUxqjViaO_yhyeAfslLHhxBPvIEthP3WVb7lswuQ_FWQ07rzn5nmEx898/s1600/DocumentDBDocumentosIV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimPHmAZpiG15Gt4rH7dBM8-uINdoknKL_WiB8PVU3bqDJwqhsJLErgZB7wdYLtbrOD9IvBw3bQUmrATjXCWflUxqjViaO_yhyeAfslLHhxBPvIEthP3WVb7lswuQ_FWQ07rzn5nmEx898/s1600/DocumentDBDocumentosIV.PNG" width="640" /></a></div>
<br />
<br />
<b>Crear documento:</b> A través de esta opción podemos crear un nuevo documento Json en nuestra colección, tan solo debemos escribir la estructura del documento y obviamente su contenido, esta opción puede ser muy útil para creación de datos de configuración y puede ser útil cuando trabajamos con archivos de estructura y datos pequeños.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6dxNPXKuZLTEUkYeKYrxIVU_DNCwvQzw2RCPgzdSZb6pVt937nco2iQ-b1Gqb3TWi0KvikU_DT3SZVE_xBHOeUi2AmxWN_XdEGKT75d7OC7owqQV3GQnnblFsmxcfZKeARVAs7SiWQIM/s1600/DocumentDBDocumentosV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6dxNPXKuZLTEUkYeKYrxIVU_DNCwvQzw2RCPgzdSZb6pVt937nco2iQ-b1Gqb3TWi0KvikU_DT3SZVE_xBHOeUi2AmxWN_XdEGKT75d7OC7owqQV3GQnnblFsmxcfZKeARVAs7SiWQIM/s1600/DocumentDBDocumentosV.PNG" width="640" /></a></div>
<br />
<br />
<b>Consultas de documentos:</b> A través de esta opción podemos realizar diferentes consultas (Las cuales explicaremos más adelante) sobre los diferentes objetos de la base de datos y en especial para obtener archivos en específico que necesitemos, usando un lenguaje sumamente similar a Sql.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3uBRnGGqwRqDFkMNFoPZ0xFB2GRPtoeU-mw7oISgMyHBlPla_UyTUqrp6z1BD6EOMN0X3OASBXbd868z6lmy94ue9Gvo9c7VPTaMc0-Qld8ao5jeDbJ3qfWeQjcY7DVF2aGBwB0lr-68/s1600/DocumentDBDocumentosVI.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3uBRnGGqwRqDFkMNFoPZ0xFB2GRPtoeU-mw7oISgMyHBlPla_UyTUqrp6z1BD6EOMN0X3OASBXbd868z6lmy94ue9Gvo9c7VPTaMc0-Qld8ao5jeDbJ3qfWeQjcY7DVF2aGBwB0lr-68/s1600/DocumentDBDocumentosVI.PNG" width="640" /></a></div>
<br />
<br />
<b>Eliminar documento:</b> A través de esta última opción como su nombre lo indica, podemos eliminar algún documento en específico que ya no necesitemos en nuestra base de datos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJZ_n9Z3VYkiRIdMQL7-gwCtPdu8Pqz_lOHvSjsMNfKOwpBxRogoT6wzeWaZohVKUNvd6zMENzDuAf0NM9yAXj8u_DfGHe5LyM3kfuyHk1ie1RHY3plMK07ZhZcIB_jQxXjTNbwdljV2k/s1600/DocumentDBDocumentosVII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJZ_n9Z3VYkiRIdMQL7-gwCtPdu8Pqz_lOHvSjsMNfKOwpBxRogoT6wzeWaZohVKUNvd6zMENzDuAf0NM9yAXj8u_DfGHe5LyM3kfuyHk1ie1RHY3plMK07ZhZcIB_jQxXjTNbwdljV2k/s1600/DocumentDBDocumentosVII.PNG" width="640" /></a></div>
<br />
Y bueno amigos eso fue todo de este ejemplo de administración de documentos en <a href="http://www.eltavo.net/search/label/DocumentDB">DocumentDB </a>espero sea de utilidad para ustedes, en el próximo artículo veremos cómo generar consultas sobre los diferentes documentos de la base de datos.<br /><br />No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br /><br />Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com3tag:blogger.com,1999:blog-64997952424391450.post-42485739904396970192015-04-27T22:38:00.001-05:002015-04-27T22:39:34.658-05:00Administrando colecciones en DocumentDB<a href="http://www.eltavo.net/2015/04/creando-mi-primera-base-de-datos.html" target="_blank">En el artículo anterior</a> vimos cómo crear una cuenta de almacenamiento para gestionar nuestra base de datos <a href="http://www.eltavo.net/search/label/DocumentDB" target="_blank">DocumentDB</a>, de igual forma vimos cómo crear bases de datos al interior de la cuenta de almacenamiento. Recordemos que las bases de datos <a href="http://www.eltavo.net/search/label/DocumentDB" target="_blank">DocumentDB </a>están divididas en diferentes colecciones, las cuales nos permiten agrupar de una manera lógica nuestros diferentes archivos de tipo Json.<br />
<br />
Y es precisamente el foco de este artículo, dar a conocer acerca de la administración de estas colecciones y cómo podemos trabajar con ellas para estructurar nuestra base de datos y clasificar nuestros documentos, además de la importancia que tienen a la hora de modelar nuestras bases de datos, tema que veremos más adelante en esta serie de <a href="http://www.eltavo.net/search/label/DocumentDB" target="_blank">DocumentDB</a>.<br />
<br />
Para iniciar vamos a crear una nueva colección llamada artículos, para esto seleccionamos nuestra cuenta de almacenamiento, posteriormente seleccionamos la base de datos donde deseamos crear la colección y luego seleccionamos la opción "Agregar Colección"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4MX11zD2-OZLdc5F3WqApGQ0JaS51A3CETfcOdr6FV_tJfrJiFim5CXoAMzwMBY3RXj9ejpgaxqqIjs4M9dXHt-SLfxvmY22wC6Lo6B3tFUhiwKcX4A63VU378jJ_p9QTeNcVQNxTlQ/s1600/DocumentDBColeccionesI.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4MX11zD2-OZLdc5F3WqApGQ0JaS51A3CETfcOdr6FV_tJfrJiFim5CXoAMzwMBY3RXj9ejpgaxqqIjs4M9dXHt-SLfxvmY22wC6Lo6B3tFUhiwKcX4A63VU378jJ_p9QTeNcVQNxTlQ/s1600/DocumentDBColeccionesI.PNG" height="444" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para terminar con la creación de la colección le debemos especificar un Id, en nuestro caso "Articulos" y debemos seleccionar un nivel de precios, que estará dado por las características de almacenamiento que requiramos y para finalizar debemos hacer clic sobre el botón Aceptar, ahora en cuestión de segundos tendremos lista nuestras colección para almacenar documentos. Y la podemos observar en el listado de colecciones de la base de datos:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBelBpiQBBBRibb3LOvi9FtyE7cHKzQeaSTXNIPsZ-J-MFJTht3s6cFa9UKgIzHVXaw9odXQ8qaRXl4KcimrNMJFQL0xKIb3jy2NqyNkRMR4BuGygSTdAeprGmyRineni9YJIMnBYjhQ/s1600/DocumentDBColeccionesII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBelBpiQBBBRibb3LOvi9FtyE7cHKzQeaSTXNIPsZ-J-MFJTht3s6cFa9UKgIzHVXaw9odXQ8qaRXl4KcimrNMJFQL0xKIb3jy2NqyNkRMR4BuGygSTdAeprGmyRineni9YJIMnBYjhQ/s1600/DocumentDBColeccionesII.PNG" height="640" width="604" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Y si la seleccionamos podremos ver todas sus características y funcionalidades que podemos aplicar sobre la colección, como por ejemplo, agregar un documento Json existente, crear un nuevo documento a través del portal de Azure, realizar consultas, eliminar documentos existentes, monitorear los request hechos a la colección y monitorear el estado de almacenamiento de la colección.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjigzZ5n8pJXvYuZZP9UnKVbSICzVbuMyy_mqEj77GGYxNKzhO3YKySkgElG1Uo3f4DlO9IhMJbPtVuqgATu4w0jYR6b3-uC4sedzmNYYaghi9-R3a1xkCvT1LJkAYylE0dN24vbQqRCf4/s1600/DocumentDBColeccionesIII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjigzZ5n8pJXvYuZZP9UnKVbSICzVbuMyy_mqEj77GGYxNKzhO3YKySkgElG1Uo3f4DlO9IhMJbPtVuqgATu4w0jYR6b3-uC4sedzmNYYaghi9-R3a1xkCvT1LJkAYylE0dN24vbQqRCf4/s1600/DocumentDBColeccionesIII.PNG" height="640" width="596" /></a></div>
<br />
Y adicional podemos usar herramientas para desarrolladores como lo son el "Explorador de documentos" y el "Explorador de consultas", los cuales nos permiten observar los documentos existentes en la colección actual u otras colecciones de la base de datos y generar diferentes consultas con el fin de encontrar documentos en específico, respectivamente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjte7UjWHYe3lYKexLwlvFKV7WWpwVdz8aK454V8wwY_VmS0OsNBoAIHXCTmUmVDiiRAUEqHUvKFcw7RCQDgy2vIYaEF4hSOWpdVevngf9DsmnioIGQRetOh7lKHq2V1HcY8Cw3JRmi22c/s1600/DocumentDBColeccionesIV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjte7UjWHYe3lYKexLwlvFKV7WWpwVdz8aK454V8wwY_VmS0OsNBoAIHXCTmUmVDiiRAUEqHUvKFcw7RCQDgy2vIYaEF4hSOWpdVevngf9DsmnioIGQRetOh7lKHq2V1HcY8Cw3JRmi22c/s1600/DocumentDBColeccionesIV.PNG" height="448" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVAuiY7_bx6K0XssooyRptjGdxTC7Cbiv_ud0rI4-66i1NSDRGfYQEFdHfHRX79Y7993s-m85cyMGFSjx3hgBvsiZWQXDHniGs2O1_oGK1Q4oUfSFeGpAsh9OermiD8ZUPl9LH7bk_1iI/s1600/DocumentDBColeccionesV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVAuiY7_bx6K0XssooyRptjGdxTC7Cbiv_ud0rI4-66i1NSDRGfYQEFdHfHRX79Y7993s-m85cyMGFSjx3hgBvsiZWQXDHniGs2O1_oGK1Q4oUfSFeGpAsh9OermiD8ZUPl9LH7bk_1iI/s1600/DocumentDBColeccionesV.PNG" height="354" width="640" /></a></div>
<br />
Y bueno amigos eso fue todo de este ejemplo de administración de colecciones en <a href="http://www.eltavo.net/search/label/DocumentDB" target="_blank">DocumentDB </a>espero sea de utilidad para ustedes, en el próximo artículo veremos cómo administrar documentos al interior de estas colecciones.<br />
<div>
<br /></div>
<div>
No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
<br />
Saludos y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com3tag:blogger.com,1999:blog-64997952424391450.post-79899848798884630822015-04-17T08:47:00.000-05:002015-04-28T10:12:18.746-05:00Creando mi primera base de datos DocumentDB<a href="http://www.eltavo.net/2015/03/documentdb-la-base-de-datos-nosql-de.html" target="_blank">En el artículo anterior</a> vimos una introducción a <a href="http://www.eltavo.net/search/label/DocumentDB" target="_blank">DocumentDB </a>la base de datos No Sql de <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Microsoft Azure</a>, en la cual hablamos un poco acerca de su estructura y filosofía. Ahora vamos a ver cómo crear nuestra primera base de datos a través del portal de Azure y cómo podemos visualizar la información.<br />
<br />
En primera instancia abrimos la versión preview del portal de <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Microsoft Azure</a>, hacemos clic sobre el botón nuevo, seleccionamos el menú de datos y almacenamiento y posteriormente seleccionamos la opción "documentDB"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzWdL3pPBQrK7reFVHEwjEPgfgH3Jf75gLrk9HlULOoikm7My4u9LLQgymXn9ULY6Hi5ba4ITzfTNsViz9KCnj4EHSWvZxD2Cgh-1x9rrtaHrgG1b148LsHBuirwrRzCK7tu73Nwoouc0/s1600/DocumentDBCrearI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzWdL3pPBQrK7reFVHEwjEPgfgH3Jf75gLrk9HlULOoikm7My4u9LLQgymXn9ULY6Hi5ba4ITzfTNsViz9KCnj4EHSWvZxD2Cgh-1x9rrtaHrgG1b148LsHBuirwrRzCK7tu73Nwoouc0/s1600/DocumentDBCrearI.png" height="579" width="640" /></a></div>
<br />
Enseguida se nos muestra la siguiente pestaña en la cual vamos a crear una cuenta de almacenamiento, tal y como lo hacemos cuando creamos una base de datos Sql en <a href="http://www.eltavo.net/search/label/Microsoft%20Azure" target="_blank">Microsoft Azure</a>, y dicha cuenta puede contener N bases de datos DocumentDB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0mXAmLbDXS8GuUGM62ayLHeEeCgzvMM1FCgB5z4euMIiRXZRuLiH8ZRXee6KOtZTyWaRF4m-9EBuO4QTn53CMpV07nGnTpqRWgifXwtHiB7sFiT40RYDPqiUn4fiapTw8-3wWADVIKd0/s1600/DocumentDBCrearII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0mXAmLbDXS8GuUGM62ayLHeEeCgzvMM1FCgB5z4euMIiRXZRuLiH8ZRXee6KOtZTyWaRF4m-9EBuO4QTn53CMpV07nGnTpqRWgifXwtHiB7sFiT40RYDPqiUn4fiapTw8-3wWADVIKd0/s1600/DocumentDBCrearII.PNG" height="640" width="322" /></a></div>
<br />
Ahora solo especificamos un Id para la cuenta de almacenamiento y una ubicación y hacemos clic sobre el botón "Crear", la creación tarda alrededor de 10 minutos.<br />
<br />
Una vez finaliza la creación de nuestra cuenta, podemos ver toda la información que corresponde a ella, como por ejemplos las bases de datos que están creadas bajo esta cuenta, monitoreo de peticiones y operaciones, gasto estimado $$$ en la suscripción por concepto de la cuenta de almacenamiento, espacio utilizado y espacio disponible, y como es obvio podemos crear una nueva base de datos DocumentDB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_EK76M0-LPdCwguATF5299jxau9m8AybHM0SCsO61wzUmmPBh9fuQWgpl8BCfJ-V2VX7w3BbxNQ9SjCfpfcBb6HY4kAieHVtztUPOZqIyAoBK-NPSwrM_ltmJ6-5CsMLnK95Uq29YccA/s1600/DocumentDBCrearIII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_EK76M0-LPdCwguATF5299jxau9m8AybHM0SCsO61wzUmmPBh9fuQWgpl8BCfJ-V2VX7w3BbxNQ9SjCfpfcBb6HY4kAieHVtztUPOZqIyAoBK-NPSwrM_ltmJ6-5CsMLnK95Uq29YccA/s1600/DocumentDBCrearIII.PNG" height="640" width="596" /></a></div>
<br />
Para crear la base de datos solo es necesario especificar un Id<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP3dCqP9jmaaXaSP7Bybi0xH-LWwI0lgD37SFWgIsxjnPp_KzBryUJqUTEGQMAx6Wk7uja5PQXuMbBXXw2cFSbyAcIs9LZIVl14Kw5vLkLkp2fkoOdWr_20p-fo38mLvzJsnnb_Y5G2VQ/s1600/DocumentDBCrearIV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP3dCqP9jmaaXaSP7Bybi0xH-LWwI0lgD37SFWgIsxjnPp_KzBryUJqUTEGQMAx6Wk7uja5PQXuMbBXXw2cFSbyAcIs9LZIVl14Kw5vLkLkp2fkoOdWr_20p-fo38mLvzJsnnb_Y5G2VQ/s1600/DocumentDBCrearIV.PNG" height="640" width="322" /></a></div>
<br />
Y de igual forma que para la cuenta, una vez creamos la base de datos podemos toda la información concerniente a ella, como por ejemplo, las colecciones que hay en la base de datos, las peticiones y uso y por supuesto los documentos que hay alojados en las diferentes colecciones de la base de datos. Cabe recordar que las bases de datos DocumentDB al igual que MongoDB y muchas otras bases de datos NoSql de tipo documental agrupan sus archivos en colecciones, las cuales para este caso son muy simples de crear:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS4wtcYqvp9yoEMU7I2kduyytBXd2BkctjGBX4Ly7ooR42s5indudBMlguUkyQ8UP-RYJpZoX_ut-3neha5USMoPA4rF57YxUmwJ11qRaBpskZlE9SaHjgfxqsA04IgLKYU8TNaQo06Pc/s1600/DocumentDBCrearV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS4wtcYqvp9yoEMU7I2kduyytBXd2BkctjGBX4Ly7ooR42s5indudBMlguUkyQ8UP-RYJpZoX_ut-3neha5USMoPA4rF57YxUmwJ11qRaBpskZlE9SaHjgfxqsA04IgLKYU8TNaQo06Pc/s1600/DocumentDBCrearV.PNG" height="344" width="640" /></a></div>
<br />
Y bueno amigos eso fue todo de este ejemplo de creación de nuestra primera base de datos DocumentDB espero sea de utilidad para ustedes, en próximos artículos veremos como manejar las colecciones de la base de datos, como crear, editar, consultar y eliminar documentos existentes.<br />
<br />
No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-91285643453478122212015-03-19T12:28:00.001-05:002015-04-27T22:41:28.641-05:00DocumentDB, la base de datos NoSql de Microsoft Azure<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr6k4KwFE52ovlCDog-advd0INEJXkuglREd2iJjIz9XwF1ANNNeCe8r2Q5YrtOMNzJJOX8w968Lcycdcuq_Lm-TgLdzgVRPODqSm_PDXH8xy_mFq_Vr7s4M_2GKsnz4ey_7w0SnaE0ts/s1600/LogoDocumentDB.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr6k4KwFE52ovlCDog-advd0INEJXkuglREd2iJjIz9XwF1ANNNeCe8r2Q5YrtOMNzJJOX8w968Lcycdcuq_Lm-TgLdzgVRPODqSm_PDXH8xy_mFq_Vr7s4M_2GKsnz4ey_7w0SnaE0ts/s1600/LogoDocumentDB.PNG" /></a><br />
<div style="text-align: justify;">
En la actualidad las aplicaciones cada vez más demandan y consumen una gran cantidad y volúmenes de datos y requieren seguir teniendo rápidos tiempos de respuesta, es por esto que cada vez toma más fuerza el concepto de NoSql, que fue diseñado para este fin, manejar grandes volúmenes de datos sin afectar la experiencia del usuario, ofreciendo facilidades para la escalabilidad horizontal y el no uso de un esquema rígido para la base de datos (Schema less).</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como respuesta a esto Microsoft combina el concepto de NoSql con el flexible y potente concepto de Cloud, a través del cual nos ofrece un servicio de base de datos NoSql documental llamado DocumentDb alojado en su plataforma en la nube Microsoft Azure.</div>
<div style="text-align: justify;">
<br /></div>
como mencioné anteriormente DocumentDb es una base de datos NoSql de tipo documental, es decir que almacena la información en documentos, y usa notación JSON para esto, de igual forma como lo hacen otras base de datos como MongoDb y CouchDb por ejemplo. Cabe recordar que la sombrilla de NoSql tiene los siguientes tipos: Documental, clave valor, grafos y familia de columnas, cada tipo con ventajas para diferentes escenarios, si estás interesando en conocer los conceptos básicos de NoSql te invito a darle un vistazo a la siguiente diapositiva: <a href="http://www.eltavo.net/2013/07/introduccion-las-bases-de-datos-no-sql.html" target="_blank">Introducción a las bases de datos NoSql</a>.<br />
<br />
Una de las ventajas de DocumentDb es que podemos realizar consultas a nuestros documentos utilizando un lenguaje de consulta muy similar a Sql, y podemos crear procedimientos almacenados, triggers, y funciones utilizando javascript, en dónde podemos realizar operaciones Crud a través de este lenguaje. Adicional otra ventaja de DocumentDb al ser una base de datos diseñada para la nube es su flexibilidad para escalabilidad y elasticidad que se ajustan a nuestras necesidades.<br />
<br />
La estructura de recursos de una base de datos DocumentDb es la siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJBPYRS0A89HKgk2_kEzqQL3KvvTY4PBImRUh-fKl_ooeuk3L_ykE33Esmf_aJLpCg0KMhraQP9ZsBuEdS9VCTItlnTlMAV8GS-gDEapTBQvzn_Y0XWyV-Bgyo6LEyxYEOdFkXBBDCyCU/s1600/DocumentDB.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJBPYRS0A89HKgk2_kEzqQL3KvvTY4PBImRUh-fKl_ooeuk3L_ykE33Esmf_aJLpCg0KMhraQP9ZsBuEdS9VCTItlnTlMAV8GS-gDEapTBQvzn_Y0XWyV-Bgyo6LEyxYEOdFkXBBDCyCU/s1600/DocumentDB.PNG" height="348" width="640" /></a></div>
<br />
Como podemos ver, debemos contar con una cuenta de almacenamiento, y sobre esta cuenta podemos tener N bases de datos, las cuales tienen usuarios con permisos asociados y colecciones, que nos permiten agrupar de una manera lógica nuestro documentos, como por ejemplo podríamos tener una colección para artículos, otra para autores, otra para categorías, etc. Y en cada colección tendremos nuestros documentos Json que contendrán nuestra información y para cada colección podemos manejar procedimientos almacenados, triggers y funciones, que recordemos programaremos con JavaScript.<br />
<br />
Ahora, para el tema de desarrollo de aplicaciones DocumentDb nos ofrece una Api Rest a través de la cual expone los recursos de la base de datos, lo cual quiere decir que podemos interactuar con la base de datos mediante cualquier lenguaje o plataforma capaz de consumir servicios de este tipo y adicional al utilizar Apis de tipo Rest podemos consumirlas muy fácilmente desde cualquier dispositivo.<br />
<br />
Además del Api Rest que expone DocumentDb también contamos con librerías específicas para plataformas las cuales nos ayudan y facilitan la interacción con la base de datos, en la actualidad tenemos librerías para las siguientes plataformas:<br />
<ul>
<li>.Net</li>
<li>Node Js</li>
<li>JavaScript</li>
<li>Pyton</li>
</ul>
<div>
Y bueno amigos eso fue todo de esta introducción sobre DocumentDb la base de datos NoSql del Microsoft Azure, espero sea de utilidad, en próximos artículos observaremos cómo crear la base de datos y sus diferentes recursos, así mismo veremos como interactuar con ella a través del SDK para .Net y también a través de las Apis Rest.<br />
<br />
Si quieres profundizar más sobre el tema te recomiendo el sitio oficial de Microsoft Azure: <a href="https://azure.microsoft.com/es-es/services/documentdb/" target="_blank">https://azure.microsoft.com/es-es/services/documentdb/</a><br />
<br />
No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a></div>
<div>
<br /></div>
<div>
Saludos y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-20493482022678448112015-03-19T10:31:00.000-05:002015-03-19T10:31:01.511-05:00Presentación: DocumentDB, la base de datos NoSql de Microsoft AzureHola amigos, hace un par de días tuve la oportunidad de dictar una introducción a documentDB, ya que fui invitado por parte de <a href="https://devacademy.la/">DevAcademy</a> para participar en uno de sus Hangouts, aquí les comparto la presentación de mi charla y espero sea de utilidad.
<br />
<br />
<iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/46041155" width="700"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-15548375252167192852015-03-15T14:59:00.001-05:002015-03-17T10:34:13.820-05:00Introducción a DocumentDB, la base de datos NoSql de Microsoft Azure.Hola amigos, hace un par de días tuve la oportunidad de dictar una introducción a documentDB, ya que fui invitado por parte de <a href="https://devacademy.la/" target="_blank">DevAcademy</a> para participar en uno de sus Hangouts, aquí les comparto la grabación de la charla y espero sea de utilidad.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/8Ud3jB8KOBA" width="670"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-7294470502524920152015-03-08T20:59:00.000-05:002015-03-08T21:06:33.482-05:00!Apunte semanal - De objetos inmutables, proxies inversos y otras finas hierbasEn nuestra disciplina, carrera, medio o como lo queramos llamar, existen diversas palabras técnicas las cuales suenan bastante complejas, y que pueden poner nuestra imaginación a volar cuando las escuchamos, y aunque lo más probable es que las usemos todos los días <strike>sin darnos cuenta</strike>, no sepamos su significado u objetivo, como por ejemplo, cuántos términos te son familiares de la siguiente lista?<br />
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Ybtgjvj4k2ykXHk2v150JX21uEObMOp_Di0Q6xjyS3OM7cjc6FmQI20_ZaVGXfcA0FwrIq85v7APIukk2OgWCwZF1Vr0TB60KF9qisnQUGIOoAUI31CW2wHRdpFhsX8wdmbqRHvJTxA/s1600/ElTavoGeneradorDeExcusaas.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Ybtgjvj4k2ykXHk2v150JX21uEObMOp_Di0Q6xjyS3OM7cjc6FmQI20_ZaVGXfcA0FwrIq85v7APIukk2OgWCwZF1Vr0TB60KF9qisnQUGIOoAUI31CW2wHRdpFhsX8wdmbqRHvJTxA/s1600/ElTavoGeneradorDeExcusaas.PNG" height="185" width="640" /></a></div>
<br />
:Pues sí, es bastante conocida y graciosa esta imagen o generador de excusas aleatorias para los informáticos, y como vemos hay muchos términos que son para dejar con la boca abierta a muchos, y otra frase que podríamos encajar perfectamente en la primera columna del generador de excusas es "Cuando logremos cambiar el valor del objeto inmutable" - "de las clases de abstracción" - "del acelerador de transacciones" o_O no suena nada mal!<br />
<br />
Pues bien, de eso va este apunte semanal, y no se trata precisamente de enriquecer nuestro generador de excusas, si no de comprender de qué se tratan los objetos inmutables, objetos que usamos a diario en nuestra profesión como desarrolladores.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" /></a><br />
<div style="text-align: justify;">
Un objeto inmutable es un objeto cuyo valor no puede cambiar una vez es creado, a diferencia de los objetos mutables, los cuales pueden sufrir cambios después de su creación.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En C# suelen manejarse muchos tipos inmutables, es por esto que debemos tener cuidado con su uso, y para comprender esto vamos a usar como ejemplo, un tipo que usamos todos los días, y que es inmutable "string" <strike>a eso me refería con que usamos todos los días objetos inmutables.</strike></div>
<br />
Por si no lo sabías cuando concatenamos otra cadena a una variable de tipo string, en realidad no estamos modificando directamente su contenido, si no que estamos creando otra variable la cual contiene el nuevo valor, aja! es por esto que siempre es recomendable usar en estos casos en los cuales tenemos que cambiar repetitivamente el valor inicial de la cadena, el tipo <b>StringBuilder</b> ya que es un tipo mutable, y debido a esto podemos cambiar su valor sin que el compilador tenga que crear nuevas cadenas.<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">string</span> mensaje <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"este es el primer mensaje"</span>;
mensaje <span style="color: #b4b4b4;">+=</span> <span style="color: #d69d85;">"(mensaje 1)"</span>;
mensaje <span style="color: #b4b4b4;">+=</span> <span style="color: #d69d85;">"(mensaje 2)"</span>;</pre>
<br />
En el caso anterior tendríamos tres variables de tipo string, mientras que en el siguiente caso estaríamos creando una variable de tipo StringBuilder y la modificaremos en varias oportunidades.<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">var</span> sb <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">StringBuilder</span>(<span style="color: #d69d85;">"este es "</span>);
sb<span style="color: #b4b4b4;">.</span>Append(<span style="color: #d69d85;">"el primer"</span>);
sb<span style="color: #b4b4b4;">.</span>Append(<span style="color: #d69d85;">"mensaje"</span>);
sb<span style="color: #b4b4b4;">.</span>Append(<span style="color: #d69d85;">"(mensaje 1)"</span>);
sb<span style="color: #b4b4b4;">.</span>Append(<span style="color: #d69d85;">"(mensaje 2)"</span>);</pre>
<br />
Bueno y eso es todo de este apunte semanal, espero sea de utilidad y nos pueda servir para optimizar nuestro código.<br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-47006192909535758132015-02-19T08:22:00.004-05:002015-02-19T08:22:45.142-05:00Conceptos básicos de Asp.Net MVCHola amigos, hace algún tiempo dicté una charla de conceptos básicos de Asp.Net MVC, aquí les comparto la presentación, espero sea de utilidad. Saludos!<br />
<br />
<iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/44876868" width="700"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-5773749511688672762015-02-08T17:20:00.003-05:002015-02-23T21:56:01.136-05:00!Apunte semanal - Problemas al depurar tareas en paralelo?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" /></a><br />
<div style="text-align: justify;">
Hola amigos, en anteriores artículos tuvimos una <a href="http://www.eltavo.net/2013/05/introduccion-la-programacion-paralela.html">introducción al paralelismo</a>, y mucho más enfocado en lo que Microsoft .Net nos ofrece para trabajar con él, en resumidas cuentas tenemos la <a href="http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx">TPL</a> que es la librería que nos permite trabajar con paralelismo de una forma muy sencilla, y que nos ofrece varias formas de trabajo como lo son el trabajo con datos a través de ciclos paralelos, <a href="http://www.eltavo.net/2013/06/programacion-paralela-traves-de-tareas.html">paralelismo a través de tareas (Task)</a>, <a href="http://www.eltavo.net/2013/05/consultas-linq-to-objects-en-paralelo.html">Plinq que nos permite realizar consultas linq en paralelo</a>, entre otras. Y entre estas formas de trabajo hay una en particular que se convierte en transversal para todas, y es la depuración de procesos en paralelo, de suma importancia y utilidad para llevar un paso a paso de las instrucciones en las cuales estemos empleando el paralelismo, ya que en este tipo de instrucciones en paralelo podemos tener problemas a la hora de depurar, ya que cuando estamos haciendo paso a paso de una instrucción en ocasiones el depurador se salta y va a otra instrucción que se está ejecutando en simultánea, y luego vuelve a anterior, con lo cual tenemos un gran problema para comprender y seguir la depuración de una tarea en específico, yo por ejemplo he tenido este problema cuando trabajo referenciando dlls de otros proyectos de los cuales no tengo los proyectos agregados en la solución que estoy depurando.</div>
<br />
<br />
Pues bueno para solucionar este problema si es que se nos presenta, podemos usar la clase <b>Debugger</b> del NameSpace <b>System.Diagnostics</b>, la cual nos permitirá hacer un punto de ruptura a través del método <b>Break()</b>, veamos cómo lo podemos hacer:<br />
<br />
Primero vamos a crear en una aplicación de consola con una ejecución de tareas que invoquen diferentes métodos, tal como vemos a continuación:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> Main(<span style="color: #569cd6;">string</span>[] args)
{
<span style="color: #4ec9b0;">Task</span> t <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Task</span>(TareaA);
t<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #4ec9b0;">Task</span> t2 <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Task</span>(TareaB);
t2<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #4ec9b0;">Task</span> t3 <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Task</span>(TareaC);
t3<span style="color: #b4b4b4;">.</span>Start();
<span style="color: #4ec9b0;">Task</span><span style="color: #b4b4b4;">.</span>WaitAll(<span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Task</span>[] { t, t2, t3 });
<span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>Write(<span style="color: #d69d85;">"Terminó la ejecución de las tareas A, B y C."</span>);
}</pre>
<br />
Y ahora vamos usar un punto de ruptura en alguna de las tareas:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> <span style="color: #569cd6;">private</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> TareaA()
{
<span style="color: #4ec9b0;">Debugger</span><span style="color: #b4b4b4;">.</span>Break();
<span style="color: #4ec9b0;">Thread</span><span style="color: #b4b4b4;">.</span>Sleep(<span style="color: #b5cea8;">2000</span>);
<span style="color: #4ec9b0;">Console</span><span style="color: #b4b4b4;">.</span>Write(<span style="color: #d69d85;">"Se ejecutó la tárea A"</span>);
}</pre>
<br />
Con este <b>Debugger.Break()</b> ahora podemos depurar el contenido de la tarea A, sin tener problemas de con las otras tareas que se ejecutan en paralelo, adicional también nos podría ser de utilidad cuando tenemos instrucciones muy tediosas de depurar, por ejemplo si estamos recorriendo una lista de 10000 ítems y tenemos un error que solo se genera con alguno de los ítems, podríamos realizar una condicional y usar el <b>Debugger.Break</b> para capturar con mayor facilidad el problema <strike>(aunque también lo podríamos hacer con las condicionales que nos ofrecen los puntos de interrupción de Visual Studio)</strike>.<br />
<br />
Bueno y eso es todo de este apunte semanal, espero sea de utilidad.<br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-71525076600363230852015-01-31T23:13:00.001-05:002015-02-23T21:56:14.787-05:00!Apunte semanal - Configurando el pool de conexiones de Entity Framework.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2QrbfrcyawHQrQE4M3sfUG2dlgrlDQpPDi492CwdpVorD87qd__yl0cHikPP0gu8T_6N16-vKhvIXcUtqWsgm0OvtR5VOX_OS30uBNqP-0wpOyOIZgai9AI2eIkcMBmeJhxhSdqNG7A/s1600/TipEdit.jpg" /></a><br />
<div style="text-align: justify;">
Sin lugar a dudas uno de los aspectos más importantes y que pueden afectar favorablemente o desfavorablemente el rendimiento de nuestras aplicaciones, es el acceso a fuentes de datos, ya que implica un costo considerable establecer conexión con dichas fuentes. Es por eso que una técnica muy utilizada para lidiar con este problema es el connection pooling o pool de conexiones, el cual permite mantener un número definido de conexiones abiertas y disponibles para que la aplicación o aplicaciones puedan usarlas sin tener que esperar a abrir una conexión, y es el pool quien se encarga de mantener estas conexiones y distribuirlas según se requiera.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Entity Framework a diferencia de otros ORM's no maneja directamente el pool de sesiones, sino que lo hace a través de ADO.Net, quien se encarga de manejar los pool para los diferentes Data Providers.</div>
<div style="text-align: justify;">
<br /></div>
<b>¿Y cómo puedo configurar este pool de Ado.Net?</b><br />
<br />
<div style="text-align: justify;">
ADO.Net maneja un pool de conexiones por cada cadena de conexión que tengamos en nuestra aplicación, quiere decir que si nos conectamos a dos bases de datos diferentes habrá un pool para cada una de ellas, o si generamos cadenas de conexión dinámicamente en tiempo de ejecución tendremos N pools de conexiones dependiendo de las que generemos <strike>(Esto de generar cadenas de conexión en tiempo de ejecución, es muy contraproducente para el manejo del pool)</strike>, es por esto que si queremos configurar el pool de conexiones debemos hacerlo modificando los siguientes parámetros:</div>
<div style="text-align: justify;">
<br /></div>
<b>Parámetros a modificar en la cadena de conexión:</b><br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: grey;"><</span><span style="color: #569cd6;">add</span><span style="color: grey;"> </span><span style="color: #92caf4;">name</span><span style="color: grey;">=</span><span style="color: grey;">"</span><span style="color: #c8c8c8;">ConnectioName</span><span style="color: grey;">"</span><span style="color: grey;"> </span><span style="color: #92caf4;">connectionString</span><span style="color: grey;">=</span><span style="color: grey;">"</span><span style="color: #c8c8c8;">data source=TAVOPC;initial catalog=PoolDemo;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework;</span>
<span style="color: #c8c8c8;">Connection Lifetime=120; Max Pool Size=20; Min Pool Size = 1; Pooling=True;</span><span style="color: grey;">"</span><span style="color: grey;"> </span><span style="color: #92caf4;">providerName</span><span style="color: grey;">=</span><span style="color: grey;">"</span><span style="color: #c8c8c8;">System.Data.SqlClient</span><span style="color: grey;">"</span><span style="color: grey;"> /></span></pre>
<br />
Como podemos ver hacemos uso de cuatro parámetros en la cadena de conexión que corresponden a la configuración del pool, aunque sus nombres son muy dicientes veamos de que se trata cada uno:<br />
<br />
<b>Connection LifeTime:</b> Define el tiempo de duración de las conexiones abiertas, se compara la hora en que se creó la conexión con el tiempo actual, para determinar según esta variable si se destruye la conexión o si permanece en pool, su valor esta dado en segundos y su valor por defecto es 0 que indica configurar el mayor tiempo de duración permitido.<br />
<br />
<b>Max Pool Size:</b> Define el número máximo de conexiones gestionadas por el pool.<br />
<br />
<b>Min Pool Size:</b> Define el número mínimo de conexiones gestionadas por el pool.<br />
<br />
<b>Pooling:</b> Define si se va a utilizar el pool para gestionar las conexiones o no.<br />
<br />
Bueno y eso es todo de este apunte semanal, espero sea de utilidad.<br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com9tag:blogger.com,1999:blog-64997952424391450.post-69476517032512922542015-01-16T23:02:00.002-05:002015-01-16T23:35:48.594-05:00!Apunte semanal - Utilizar nombres de variables con palabras reservadas de C#<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhppiHmtKcyabPiPdBQj0T8fGvPh1VVITvLzhcvr8NL8oeq05gaU3bFIjZirDm2r007MoFCZHomFe_DXluVNANq2nYWjp8hAR3-3IfwtSwPfMjwJHKsvxPFF-E2TSTahbI2hJMJL4w6rRE/s1600/TipEdit.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhppiHmtKcyabPiPdBQj0T8fGvPh1VVITvLzhcvr8NL8oeq05gaU3bFIjZirDm2r007MoFCZHomFe_DXluVNANq2nYWjp8hAR3-3IfwtSwPfMjwJHKsvxPFF-E2TSTahbI2hJMJL4w6rRE/s1600/TipEdit.jpg" /></a>Hola amigos, en este apunte semanal les quiero compartir un truco bastante sencillo, que si bien no es una buena práctica puede servir en algún caso extremo que tengamos y que por motivos de fuerza mayor necesitemos utilizar, sin embargo solo lo recomiendo en un caso extremo que tengamos.<br />
<br />
Sabemos que en C# y en los diferentes lenguajes no podemos usar las palabras reservadas del lenguaje para el nombramiento de variables como por ejemplo, using, namespace, int, string y un lago etcétera, ya que obtendremos un error como el siguiente:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiziht6Ys1ZzKECwzY3nefqdjrr7yiPvlE9mv5Mi29t846GjOrBcIwtSBumCYXK_gFRF-KDw8LbliI2ShzLDNy1hjNFb2QQ0rgb3JwJ2Pfq-3JgF4Ll_xWfTlOYhbcQyLBxEiVa2TZpL6o/s1600/CapturaNombresReservadosI.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiziht6Ys1ZzKECwzY3nefqdjrr7yiPvlE9mv5Mi29t846GjOrBcIwtSBumCYXK_gFRF-KDw8LbliI2ShzLDNy1hjNFb2QQ0rgb3JwJ2Pfq-3JgF4Ll_xWfTlOYhbcQyLBxEiVa2TZpL6o/s1600/CapturaNombresReservadosI.PNG" height="260" width="320" /></a></div>
<br />
Como en este caso se quiere utilizar el nombre de variable int, se debe anteponer el carácter @ al nombre de la variable, como se muestra a continuación:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeHX2gsQHuQiQ-q8Nz1P-Xxq3jlGKRHhcYOtd9k9tE27oUZRp2MPnWMYZgHBZa-fGtP7AC8qZyuE9QjbgY3ZfsGWkutmFtltwu8Oyk0pOJlfYhwV2W0pDltCQ5P3SgVBbRQJCnL3iIEHE/s1600/CapturaNombresReservadosII.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeHX2gsQHuQiQ-q8Nz1P-Xxq3jlGKRHhcYOtd9k9tE27oUZRp2MPnWMYZgHBZa-fGtP7AC8qZyuE9QjbgY3ZfsGWkutmFtltwu8Oyk0pOJlfYhwV2W0pDltCQ5P3SgVBbRQJCnL3iIEHE/s1600/CapturaNombresReservadosII.PNG" height="201" width="320" /></a></div>
<br />
Como podemos apreciar no es una buena práctica ni muy cómodo para escribir, leer o mantener el código, sin embargo como digo puede servir en un caso de fuerza mayor, o por ejemplo si queremos interactuar con código escrito en otro lenguaje, es decir si por ejemplo tenemos una librería de clases escrita en VisualBasic .net y en esta librería tenemos escrita alguna palabra reservada de C# pero que no es reservada en Vb, nos compilaría perfectamente la librería, pero al momento de invocarla desde C# tendríamos un error de compilación, en este caso podemos resolver el problema usando el carácter @ para referirnos a la palabra reservada.<br />
<br />
Bueno y eso es todo de este apunte semanal, espero sea de utilidad.<br />
<br />
Saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-66573715048254491412015-01-15T23:10:00.001-05:002015-01-15T23:10:08.424-05:00Microsoft MVP .Net 2015<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EAwHiZ83QV_W_Og0wXO0Ev3kNCwbT7c_ZxgzhlM9j8UG_5QcBKpcTS6N3Xg5Vvwget57RcZOM11NByXvm0wcj7kbdfvBShGnvySChH5RWYcNYYsbBb9oeSbWggU-pE1JmnfTm4m9DUM/s1600/MVP_Logo_Preferred_Cyan300_RGB_300ppi.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EAwHiZ83QV_W_Og0wXO0Ev3kNCwbT7c_ZxgzhlM9j8UG_5QcBKpcTS6N3Xg5Vvwget57RcZOM11NByXvm0wcj7kbdfvBShGnvySChH5RWYcNYYsbBb9oeSbWggU-pE1JmnfTm4m9DUM/s1600/MVP_Logo_Preferred_Cyan300_RGB_300ppi.png" height="200" width="126" /></a><br />
<div style="text-align: justify;">
Hola amigos, al inicio de este año recibí una gran noticia por parte de Microsoft, más específicamente del <a href="http://mvp.microsoft.com/es-ES/default.aspx" target="_blank">programa Microsoft MVP</a>, que es un programa en el cual se reconocen a líderes excepcionales de la comunidad por sus aportes en ella y por su especialidad en algún producto de Microsoft. Pues bien, esa gran noticia es que he sido reconocido este año como Microsoft MVP en la especialidad de .NET.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es para mí un orgullo pertenecer a este selecto grupo y no quería dejar pasar la oportunidad para</div>
<div style="text-align: justify;">
agradecerles a ustedes, Comunidad, quienes hacen esto posible, gracias a ti, que lees mis post y aportas a ellos, pues ustedes son quienes fortalecen la labor de apasionados por la tecnología como yo y como muchos otros, que buscan aportar su granito de arena para que la comunidad tecnológica siga creciendo y cambiando el mundo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aprovecho también para felicitar a los nuevos MVP`s de mi país Colombia, y a todos los nuevos MVP`s de todo el mundo, y a los demás MVP`s antiguos quienes aportan a la comunidad en su especialidad.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Muchas gracias a todos! y espero poder seguir escribiendo, aportando en los foros, dictando charlas y demás cosas que me apasionan y contribuyen y ayudan a las demás personas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Saludos y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-27503007981545166742014-12-23T22:29:00.000-05:002015-01-15T23:13:52.890-05:00Usando ExistDB (No Sql) desde .Net con C#ExistDB es una base de datos <a href="http://www.eltavo.net/search/label/No%20SQl" target="_blank">No Sql</a>, de la familia documental, es decir es una base de datos basada en documentos, y estos documentos tienen notación Xml. A través de las bases de datos <a href="http://www.eltavo.net/search/label/No%20SQl" target="_blank">No Sql</a> podemos llegar a suplir requerimientos de manejo de grandes volúmenes de datos sin afectar el rendimiento de nuestras aplicaciones, y pensadas para aplicaciones donde la consistencia y transaccionalidad de datos no sean la prioridad, al contrario de los sistemas de bases de datos relaciones RDBMS como Sql Server por ejemplo. Si no estás muy familiarizado con las bases de datos No Sql aquí te dejo esta presentación que te puede orientar un poco: <a href="http://www.eltavo.net/2013/07/introduccion-las-bases-de-datos-no-sql.html" target="_blank">Introducción a las bases de datos No Sql</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3PTifKYNMpMfhIs4NWdaS5Zyx_vYWB9K9rodKLrSiV4pouwbmH6Qjb2yEvKtUP0W7ApXyrMdVG3ggYX7oxkkq2nlZVzWL8MA_NAwrrmuSYlyXo6_CjUDIvcMUyp7VohaY33DZN3HiQ4/s1600/image.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3PTifKYNMpMfhIs4NWdaS5Zyx_vYWB9K9rodKLrSiV4pouwbmH6Qjb2yEvKtUP0W7ApXyrMdVG3ggYX7oxkkq2nlZVzWL8MA_NAwrrmuSYlyXo6_CjUDIvcMUyp7VohaY33DZN3HiQ4/s1600/image.png" height="94" width="320" /></a></div>
<br />
Si quieres encontrar más información acerca de ExistDB, puedes observar su sitio oficial <a href="http://exist-db.org/exist/apps/homepage/index.html" target="_blank">exist-db.org</a>, adicional en la siguiente página toda la documentación del producto <a href="http://exist-db.org/exist/apps/doc/" target="_blank">ExistDB Documentación</a> y como no puede faltar también cuenta con una <a href="http://exist-db.org/exist/apps/doc/devguide.xml" target="_blank">guía para desarrolladores</a>.<br />
<br />
Y después de esta breve introducción, ahora si vamos a ver cómo podemos guardar documentos Xml en una base de datos ExistDB desde .Net, con nuestro lenguaje preferido C#. Y este artículo surge básicamente por la falta de documentación del tema en Internet, ya que la verdad no pude encontrar ejemplos de esto y por eso les quiero compartir un ejemplo muy sencillo, de como interactuar con esta base de datos a través de unas Apis Rest que expone (<a href="http://exist-db.org/exist/apps/doc/devguide.xml" target="_blank">de otras opciones que tiene</a>)<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">var</span> credenciales <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">HttpClientHandler</span> { Credentials <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">NetworkCredential</span>(<span style="color: #d69d85;">"user"</span>, <span style="color: #d69d85;">"pass"</span>)};
<span style="color: #569cd6;">using</span> (<span style="color: #569cd6;">var</span> httpClient <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">HttpClient</span>(credenciales))
{
<span style="color: #569cd6;">var</span> request <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">HttpRequestMessage</span>(<span style="color: #4ec9b0;">HttpMethod</span><span style="color: #b4b4b4;">.</span>Put, <span style="color: #569cd6;">string</span><span style="color: #b4b4b4;">.</span>Concat(<span style="color: #d69d85;">"UrlExistDB"</span>, <span style="color: #d69d85;">"NombreColeccion"</span>, <span style="color: #d69d85;">"nombreArchivo"</span>))
{
Content <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">StringContent</span>(<span style="color: #d69d85;">"DocumentoXML"</span>, <span style="color: #4ec9b0;">Encoding</span><span style="color: #b4b4b4;">.</span>UTF8, <span style="color: #d69d85;">"text/xml"</span>)
};
<span style="color: #569cd6;">var</span> response <span style="color: #b4b4b4;">=</span> httpClient<span style="color: #b4b4b4;">.</span>SendAsync(request)<span style="color: #b4b4b4;">.</span>Result;
<span style="color: #57a64a;">//response.Content.ReadAsStringAsync();</span>
}</pre>
<br />
<pre style="background: rgb(30, 30, 30); color: gainsboro; font-family: Consolas; font-size: 13px;"></pre>
Como podemos ver es algo bastante sencillo, en donde consumimos el Api expuesta por la instalación que hicimos de ExistDB, indicamos en que colección queremos almacenar el archivo, <strike>ExistDB agrupa en diferentes colecciones que creamos para almacenar los diferentes archivos xml</strike> el nombre del archivo y por último enviamos el archivo xml que queremos almacenar, y todo usando un httpClient o cualquiera de las otras opciones que nos ofrece .Net para realizar este tipo de peticiones.
Nótese que en esta ocasión usamos el verbo http Put, pero podríamos usar cualquier otro dependiendo de la operación que queramos realizar en la base de datos.<br />
<br />
Cabe resaltar que el secreto está en estudiar las diferentes Apis que nos ofrece ExistDB y obviamente comprender REST, y al manejar esta filosofía es bastante eficiente el almacenamiento, lo puedo decir ya que he tenido óptimos resultados almacenando archivos xml bastante grandes.<br />
<br />
Y bueno amigos eso es todo de este ejemplo de cómo interactuar con ExistDB desde .Net usando el lenguaje C#, espero sea de utilidad.
saludos y buena suerte!Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-56066734016285560012014-12-07T19:33:00.001-05:002014-12-07T19:33:19.675-05:00Big Data & Hadoop & HDInsightHola amigos, el día de ayer 6 de diciembre de 2014, estuve en el evento CloudCamp Medellín organizado por Microsoft Colombia DX, en el cual estuve compartiendo sobre Big data en general, y acerca de una herramienta como lo es Hadoop, y obviamente compartiendo la propuesta por parte de Microsoft llamada HDInsight, la cual esta basada sobre Hadoop y nos permite tener una versión on premise y una versión en la nube, acá les dejo la presentación y espero sea de utilidad para ustedes. Saludos!<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/42450807" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="700"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/galzatesandoval/big-data-hdinsight" target="_blank" title="Big data, Hadoop, HDInsight">Big data, Hadoop, HDInsight</a> </strong> from <strong><a href="https://www.slideshare.net/galzatesandoval" target="_blank">Tavo Alzate Sandoval</a></strong> </div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com1tag:blogger.com,1999:blog-64997952424391450.post-4835184160488237232014-11-26T22:40:00.002-05:002014-11-27T08:13:41.110-05:00[EntityFramework] Usando EntityFramewok y sql AzureHola amigos, tuve el gusto de ser invitado a participar con un par de vídeos para la campaña <a href="https://www.facebook.com/hashtag/100devdays?source=feed_text&story_id=10204279510483846&pnref=story" target="_blank">#100DevDays</a> de Microsoft Visual Estudio, realizada en el <a href="http://channel9.msdn.com/Blogs/DevWow/" target="_blank">Channel9 Latam</a>, en esta ocasión expliqué como usar EntityFramework y Sql Azure, aquí les dejo el vídeo y también puedes observar el paso a paso en este artículo: <a href="http://www.eltavo.net/2014/04/utilizando-sql-azure-y-entity-framework.html" target="_blank">EntityFramework y Sql Azure</a><br />
<br />
<iframe allowfullscreen="" frameborder="0" height="540" src="//channel9.msdn.com/Blogs/DevWow/100devdays-Usando-Entity-Framework-con-SQL-Azure/player" width="700"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com2tag:blogger.com,1999:blog-64997952424391450.post-7868428680659838242014-11-20T22:00:00.001-05:002014-11-20T22:00:08.609-05:00Introducción a la arquitectura de softwareHola amigos, hace algún tiempo dicté una charla de introducción a la arquitectura del software, aquí les comparto la presentación, espero sea de utilidad. Saludos!<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/41834979" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="700"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/galzatesandoval/introduccin-a-la-arquitectura-de" target="_blank" title="Introducción a la Arquitectura de Software">Introducción a la Arquitectura de Software</a> </strong> from <strong><a href="https://www.slideshare.net/galzatesandoval" target="_blank">Tavo Alzate Sandoval</a></strong> </div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-53264977018528534972014-11-20T21:51:00.000-05:002014-11-20T21:56:11.662-05:00Introducción a Asp.Net MVCHola amigos, hace algún tiempo dicté una charla de introducción a Asp.Net Mvc, aquí les comparto la presentación, espero sea de utilidad. Saludos!<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/37704547" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="700"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/galzatesandoval/introduccin-a-aspnet-mvc" target="_blank" title="Introducción a Asp.Net Mvc">Introducción a Asp.Net Mvc</a> </strong> from <strong><a href="https://www.slideshare.net/galzatesandoval" target="_blank">Tavo Alzate Sandoval</a></strong> </div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-47054568270662526502014-11-14T22:58:00.002-05:002014-11-24T22:26:43.800-05:00[EntityFramework] Logueando e interceptando operacionesHola amigos, tuve el gusto de ser invitado a participar con un par de vídeos para la campaña <a href="https://www.facebook.com/hashtag/100devdays?source=feed_text&story_id=10204279510483846&pnref=story" target="_blank">#100DevDays</a> de Microsoft Visual Estudio, realizada en el <a href="http://channel9.msdn.com/Blogs/DevWow/" target="_blank">Channel9 Latam</a>, en esta ocasión expliqué un poco acerca de intercepción de operaciones en EntityFramework, aquí les dejo el vídeo:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="540" src="//channel9.msdn.com/Blogs/DevWow/100devdays-Logeando-e-interceptando-operaciones-de-la-base-de-datos/player" width="700"></iframe>Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com0tag:blogger.com,1999:blog-64997952424391450.post-19167621402110137922014-10-20T23:33:00.000-05:002015-04-27T22:43:26.727-05:00[Patrones] Implementando patrón repositorio - Repository pattern en C# Parte IV<a href="http://www.eltavo.net/2014/08/patrones-implementando-patron_24.html" target="_blank">En el artículo anterior</a> observamos cómo crear los repositorios para MongoDB y para Asp.Net Web Api, ahora observaremos como consumir estos repositorios que hemos creado a lo largo de esta serie desde una aplicación, en este caso usaremos una aplicación web <a href="http://www.asp.net/mvc" target="_blank">Asp.Net MVC</a>, desde la cual consumiremos todos los repositorios. Entonces crearemos un módulo para administrar los empleados <strike>que recordemos están en una base de datos Sql Server</strike>, incluyendo sus datos de contacto <strike>que recordemos están expuestos en un servicios Web Api</strike> y un módulo para administrar los artículos escritos por estos empleados <strike>que recordemos están almacenados en una base de datos documental en MongoDB.</strike> Lo primero que vamos a hacer es crear un sitio Asp.Net MVC en Visual Studio, y una vez lo tengamos vamos a crear los controladores para el formulario de empleados y para el formulario de artículos, y obviamente vamos a crear sus vistas, teniendo una estructura como la siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhILDKjbqlk5PBQwHAeafzo-UbbVlSQRJJvrYSkRZSp1nrQucWY-7yO6ZaQDC3IPeGMjHqSI3i8E5IaIc3xc6BF-mg46JUKSyo0m4WRgyQBin2e-xJMNQDHlYdV7QXn28G-OdOPxaTxp7U/s1600/RepositoryPatternClienteWeb.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhILDKjbqlk5PBQwHAeafzo-UbbVlSQRJJvrYSkRZSp1nrQucWY-7yO6ZaQDC3IPeGMjHqSI3i8E5IaIc3xc6BF-mg46JUKSyo0m4WRgyQBin2e-xJMNQDHlYdV7QXn28G-OdOPxaTxp7U/s1600/RepositoryPatternClienteWeb.PNG" height="320" width="212" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Recordemos que nuestros controladores se comunicarán con nuestros repositorios, por lo cual los debemos referenciar a nuestro proyecto <a href="http://www.asp.net/mvc" target="_blank">Asp.Net MVC</a>, de esta forma vamos a utilizar todo el acceso a las diferentes fuentes de datos (Sql server, MongoDB y Web Api) y nuestra aplicación web no sabrá de donde provienen los datos y por ende estará desacoplada del acceso a datos. Visualmente tendremos un Crud bastante sencillo para los empleados y sus datos de contacto y un crud para los artículos como se aprecia en las siguientes imágenes:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZpBk0oyR1_rp-m3OJb3Qj4XFRKnRX7BpHKk0-TGFujsf-iPWah_ABQBvNaT6ASNvVlIpCIpxvGxDTrKVIYfDzAtdCQGBsmhor4G3PAhBDPwo9eAHDNo6eeA-XFS61qWgEZuVFAS1oWuA/s1600/RepositoryPatternCrudArticulos.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZpBk0oyR1_rp-m3OJb3Qj4XFRKnRX7BpHKk0-TGFujsf-iPWah_ABQBvNaT6ASNvVlIpCIpxvGxDTrKVIYfDzAtdCQGBsmhor4G3PAhBDPwo9eAHDNo6eeA-XFS61qWgEZuVFAS1oWuA/s1600/RepositoryPatternCrudArticulos.PNG" height="196" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQXliuK0ZHRIHNWBE8ucGNLWbaiqPxW4RbcFv3bcLACLkzfqR-kwyIMwcpc8jaDF3PFooqWyLfbZHi6GQ9y0gYEum8aSKQpKG8V2ALLalUaFi5QPMKMseegyKh1XeOB55nbBW7wSul9Q/s1600/RepositoryPatternCrudEmpleados.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQXliuK0ZHRIHNWBE8ucGNLWbaiqPxW4RbcFv3bcLACLkzfqR-kwyIMwcpc8jaDF3PFooqWyLfbZHi6GQ9y0gYEum8aSKQpKG8V2ALLalUaFi5QPMKMseegyKh1XeOB55nbBW7wSul9Q/s1600/RepositoryPatternCrudEmpleados.PNG" height="142" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Ahora veamos el código de nuestros controladores y como se comunican con los repositorios:</div>
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> <span style="color: #569cd6;">private</span> <span style="color: #b8d7a3;">IEmpleadoRepository</span> empleadoRepository;
<span style="color: #57a64a;">// GET: Empleado</span>
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Index()
{
empleadoRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">EmpleadoRepository</span>();
<span style="color: #569cd6;">var</span> empleados <span style="color: #b4b4b4;">=</span> empleadoRepository<span style="color: #b4b4b4;">.</span>ObtenerEmpleados();
<span style="color: #569cd6;">return</span> View(empleados);
}
<span style="color: #57a64a;">// GET: Empleado/Details/5</span>
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Details(<span style="color: #569cd6;">string</span> id)
{
empleadoRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">EmpleadoRepository</span>();
<span style="color: #569cd6;">var</span> empleado <span style="color: #b4b4b4;">=</span> empleadoRepository<span style="color: #b4b4b4;">.</span>ObtenEmpleadoPoId(id<span style="color: #b4b4b4;">.</span>ToString());
<span style="color: #569cd6;">var</span> datosRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">DatosContactoRepository</span>();
empleado<span style="color: #b4b4b4;">.</span>DatosContacto <span style="color: #b4b4b4;">=</span> datosRepository<span style="color: #b4b4b4;">.</span>ObtenerDatosContactoEmpleado(id<span style="color: #b4b4b4;">.</span>ToString());
<span style="color: #569cd6;">return</span> View(empleado);
}
<span style="color: #57a64a;">// POST: Empleado/Create</span>
[<span style="color: #4ec9b0;">HttpPost</span>]
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Create(<span style="color: #4ec9b0;">Empleado</span> model)
{
<span style="color: #569cd6;">try</span>
{
empleadoRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">EmpleadoRepository</span>();
model<span style="color: #b4b4b4;">.</span>Id <span style="color: #b4b4b4;">=</span> <span style="color: #4ec9b0;">DateTime</span><span style="color: #b4b4b4;">.</span>Now<span style="color: #b4b4b4;">.</span>Ticks<span style="color: #b4b4b4;">.</span>ToString();
empleadoRepository<span style="color: #b4b4b4;">.</span>GuardarEmpleado(model);
<span style="color: #569cd6;">return</span> RedirectToAction(<span style="color: #d69d85;">"Index"</span>);
}
<span style="color: #569cd6;">catch</span>
{
<span style="color: #569cd6;">return</span> View(model);
}
}</pre>
<br />
Como podemos ver, en nuestro controlador de Empleados, en la acción Index creamos una instancia de EmpleadoRepository y hacemos uso del método ObtenerEmpleados, el cual se encarga de obtener los empleados almacenados en la base de datos Sql Server, recordemos que dicho repositorio implementa una interface y adicional hereda de un repositorio base, lo cual nos brinda la oportunidad de cambiar por otra implementación concreta en caso de que sea necesario.<br />
<br />
De esta forma nuestros repositorios nos ayudan a aislar todas las operaciones de acceso a datos, por ejemplo en este caso, obtuvimos datos de Sql Server y adicional datos de un Web Api, y nuestra aplicación <a href="http://www.asp.net/mvc" target="_blank">Asp.Net MVC</a> no se dio por enterada de dónde salieron los datos. Ahora observemos el controlador para interactuar con los artículos escritos por los empleados <strike>que recordemos están en una base de datos No Sql como lo es MongoDB.</strike><br />
<strike><br /></strike>
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> <span style="color: #569cd6;">private</span> <span style="color: #b8d7a3;">IArticuloRepository</span> _articuloRepository;
<span style="color: #57a64a;">// GET: Articulo</span>
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Index()
{
_articuloRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">ArticuloRepository</span>();
<span style="color: #569cd6;">var</span> articulos <span style="color: #b4b4b4;">=</span> _articuloRepository<span style="color: #b4b4b4;">.</span>ObtenerArticulos();
<span style="color: #569cd6;">return</span> View(articulos);
}
<span style="color: #57a64a;">// GET: Articulo/Create</span>
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Create()
{
<span style="color: #569cd6;">return</span> View();
}
<span style="color: #57a64a;">// POST: Articulo/Create</span>
[<span style="color: #4ec9b0;">HttpPost</span>]
[<span style="color: #4ec9b0;">ValidateInput</span>(<span style="color: #569cd6;">false</span>)]
<span style="color: #569cd6;">public</span> <span style="color: #4ec9b0;">ActionResult</span> Create(<span style="color: #4ec9b0;">Articulo</span> model)
{
<span style="color: #569cd6;">try</span>
{
_articuloRepository <span style="color: #b4b4b4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">ArticuloRepository</span>();
_articuloRepository<span style="color: #b4b4b4;">.</span>GuardarArticulo(model);
<span style="color: #569cd6;">return</span> RedirectToAction(<span style="color: #d69d85;">"Index"</span>);
}
<span style="color: #569cd6;">catch</span>
{
<span style="color: #569cd6;">return</span> View();
}
}</pre>
<br />
Como podemos observar, de igual forma nuestro controlador de artículos se comunica solo con nuestro repositorio y en ningún momento sabe que los datos provienen o se llevan a una base de datos MongoDB.<br />
<br />
Y bueno amigos, con esto damos por terminada esta mini serie sobre el patrón repositorio o repository pattern, espero que sea de utilidad para ustedes.<br />
<br />
Artículos anteriores de la serie:<br />
<br />
<a href="http://www.eltavo.net/2014/08/patrones-implementando-patron_24.html" target="_blank">Implementando patrón repositorio - Repository pattern en C# Parte III</a><br />
<a href="http://www.eltavo.net/2014/08/patrones-implementando-patron_13.html" target="_blank">Implementando patrón repositorio - Repository pattern en C# Parte II</a><br />
<a href="http://www.eltavo.net/2014/08/patrones-implementando-patron.html" target="_blank">Implementando patrón repositorio - Repository pattern en C# Parte I</a><br />
<br />
Este ejemplo lo puedes descargar de <a href="https://github.com/Eltavo/PatronesDisenoC-Sharp">mi repositorio en GitHub</a><br />
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/Eltavo/PatronesDisenoC-Sharp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHINAbHKLpTaOYnjCOeFOILk8KwUDy0Lr3RAUr6Lw4Isxnd-Ta61bAThQABAK6ApvqO2biXd2KTiFI81KPHnCUkADhZ3BJRHNzsac1SEfxopFMS5HhAyIPbTOGRwvY_URxXZdEHAqglQ/s1600/GitHubNinja.jpg" height="150" width="150" /></a></div>
No olvides visitar mi página en Facebook para mantenerte actualizado de lo que pasa en el Tavo.Net <a href="https://www.facebook.com/eltavo.net">https://www.facebook.com/eltavo.net</a><br />
Saludos, y buena suerte!</div>
Anonymoushttp://www.blogger.com/profile/09324519377678407471noreply@blogger.com16