<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>O bruxo mobile</title><link>http://geeks.ms/blogs/unai/default.aspx</link><description>Grandes historias sobre pequeños dispositivos</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>DDD, agregados y NoSQL</title><link>http://geeks.ms/blogs/unai/archive/2012/01/30/ddd-agregados-y-nosql.aspx</link><pubDate>Mon, 30 Jan 2012 19:35:35 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:203068</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=203068</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=203068</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2012/01/30/ddd-agregados-y-nosql.aspx#comments</comments><description>&lt;p&gt;En la &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx"&gt;segunda entrada&lt;/a&gt; que se publico en este blog sobre &lt;a&gt;RavenDB&lt;/a&gt; se hizo una pequeña mención, no demasiado grande la verdad, a la forma en la que tenemos que diseñar nuestros documentos en una base de datos NoSQL. La verda es que esto, no es muy sencillo para aquellos que empiezan a trabajar en una base de datos no relacional, puesto que pasar de diseñar tablas y sus relaciones a documentos sin relaciones es un cambio importante, muy importante diría yo. Todos sabemos que un documento no tiene porque ser una estructura sencilla, sino, que puede ser una agregación de otras entidades, pero &lt;strong&gt;¿cual es el punto en el que rompemos esa agregación o cluster de entidades?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La siguiente imagen nos muestra un posible diseño de un documento para una estructura de producto, backlog items, task, sprint etc…en el que se ha decidido crear un único tipo de documento que aglutine esta información,&lt;em&gt; la imagen se ha extraído del Management Studio de Raven DB, pero lo mismo se aplicaría a cualquier base de datos documental como &lt;/em&gt;&lt;a href="http://www.mongodb.org"&gt;&lt;em&gt;MongoDB&lt;/em&gt;&lt;/a&gt;&lt;em&gt; etc..&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_45BC4879.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_6F036AAA.png" width="1028" height="628" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Independientemente de la que los atributos del documento sean más o menos reales o que falte algo de información&lt;strong&gt; ¿es este un buen diseño de documento? ¿Deberíamos hacer documentos más pequeños y, si es así, cual es la referencia/técnica que debemos utilizar?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La respuesta que yo siempre intento dar es asimilar el diseño de documentos con los mismos conceptos que utilizamos en DDD con &lt;strong&gt;Aggregate Roots. &lt;/strong&gt;Cuando uno empieza a trabajar con agg roots ( un concepto facil de explicar pero dificil de poner en la práctica ), tiene&amp;#160; prácticamente las mismas dudas e inquietudes, y casi siempre, estas se resuelven pensando en &lt;strong&gt;invariants&lt;/strong&gt; y &lt;strong&gt;consistency boundary &lt;/strong&gt;en vez de &lt;strong&gt;elementos composicionales&lt;/strong&gt;, como por ejemplo podría haber sido nuestro caso en el que se ha pensado en la composición de un producto sobre cualquier otro concepto. Si en vez de forma composicional pensaramos en consistencia transaccional y la preservación de invariantes nos daríamos cuenta de como un agregado tan grande como el nuestro provocaría infinidad de transacciones erroneas puesto que en el negocio es habitual que varias personas por ejemplo se dedicaran a incluir nuevos backlogitems de forma concurrente, etc etc…&lt;/p&gt;  &lt;p&gt;Por supuesto, la otra alternativa a hacer un agregado de grandes dimensiones como este, sería definir agregados por entidad, es decir, múltiples agregados, pero.. ¿es esta la vía correcta? Aquí en realidad, incurrimos en el mismo error que el anterior, no pensar en invariantes&amp;#160; consistencia. Sigamos con el ejemplo, ¿tiene sentido separar un producto de sus backlogItems? ¿hay algún invariante que mantener? Si lo piensa, seguramente podríamos separarlo sin más problemas y esto, incurriría en muchas ventajas para nosotros puesto que los errores de concurrencia que teníamos antes desaparecerían fácilmente.. pero, siguiendo con un ejemplo similar ¿tiene sentido separar un pedido y sus lineas de pedido?¿hay invariantes y/o consistencia transaccional que mantener?.&lt;/p&gt;  &lt;p&gt;Seguramente ya ha notado la diferencia entre ámbos casos ¿verdad?¿ seguro?&amp;#160; Pues bien, esta es la forma de pensar a la hora de diseñar los agregados, pensando en los invariantes y la consistencia, intentando siempre que sean lo más finos posible.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El trabajo con los documentos es un nuevo aprendizaje para muchos, y durante este aprendizaje, como en todos, cometeremos errores. Espero que con este posts y con las consiguientes referencias bibliográficas el número de errores a cometer sea el mínimo posible. Por supuesto, dependiendo de su &lt;strong&gt;NoSQL&lt;/strong&gt; documental preferida tendrá ventajas a la hora de trabajar el diseño de documentos y su trabajo, el manejo de la concurrencia o las referencias podrían ser unas de las características a revisar en su motor.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Referencias&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Excelente serie sobre diseño de agregados de Vaughn Vernon:&lt;a title="http://www.shiftmethod.com/publications" href="http://www.shiftmethod.com/publications"&gt;http://www.shiftmethod.com/publications&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Domain Driven Design, Aggregates: &lt;a title="http://domaindrivendesign.org/node/88" href="http://domaindrivendesign.org/node/88"&gt;http://domaindrivendesign.org/node/88&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;  &lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203068" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Mongo/default.aspx">Mongo</category><category domain="http://geeks.ms/blogs/unai/archive/tags/DDD/default.aspx">DDD</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>EF 4.3 Beta 1: más madera….y un pequeño extra…</title><link>http://geeks.ms/blogs/unai/archive/2012/01/13/ef-4-3-beta-1-m-225-s-madera-y-un-peque-241-o-extra.aspx</link><pubDate>Thu, 12 Jan 2012 23:20:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202734</guid><dc:creator>Unai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202734</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202734</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2012/01/13/ef-4-3-beta-1-m-225-s-madera-y-un-peque-241-o-extra.aspx#comments</comments><description>&lt;p&gt;Cuando se publique este post habr&amp;aacute; salido ya el anuncio de la primera beta de &lt;strong&gt;ADO.NET EF 4.3 &lt;/strong&gt;en el blog del equipo de producto de ADO.NET. Los que me leeis con asiduidad sabr&amp;eacute;is que si solamente es para poner una rese&amp;ntilde;a no suelo escribir una entrada o sea que tratar&amp;eacute; de dar mi punto de vista sobre esta nueva beta y algunas cosillas extras que no salen publicadas en los diferentes &lt;strong&gt;walkthrough.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien, antes de empezar con las novedades, que enumeraremos a continuaci&amp;oacute;n, es importante decir que esta ser&amp;aacute; la &amp;uacute;ltima versi&amp;oacute;n de EF hasta la llegada de &lt;strong&gt;EF&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;5.0 &lt;/strong&gt;con la siguiente entrega de &lt;strong&gt;.NET Framework, &lt;/strong&gt;en la que el c&amp;oacute;digo base, es decir, System.Data.Entity, por fin abrir&amp;aacute; m&amp;aacute;s puertas para introducir m&amp;aacute;s y m&amp;aacute;s importantes mejoras. Como acabamos de comentar, de entre las novedades m&amp;ntilde;as importantes que podemos encontrar en esta version tenemos los siguientes elementos, para el resto de informaci&amp;oacute;n, revisar la entrada del grupo de producto &lt;a target="_blank" href="http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-released.aspx" title="aqu&amp;iacute;"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inclusi&amp;oacute;n del paquete de Migraciones dentro del c&amp;oacute;digo base de EntityFramework.dll &lt;/li&gt;
&lt;li&gt;Resueltos un par de bugs, revisar el post del grupo de producto &lt;/li&gt;
&lt;li&gt;Una nueva secci&amp;oacute;n de configuraci&amp;oacute;n que nos permitir&amp;aacute; establecer inicializadores y configurar la &lt;strong&gt;DefaultConnectionFactory&lt;/strong&gt; que utilizaremos por defecto &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Migraciones es ahora parte de EF&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como ya comentamos en &lt;a href="http://geeks.ms/blogs/unai/archive/2011/11/30/ef-migrations-ef-4-3-y-que-nos-deparar-225-el-futuro.aspx"&gt;esta anterior entrada&lt;/a&gt; desde esta versi&amp;oacute;n EF incluye por defecto el paquete de migraciones, sin tener, como hasta ahora que incluir en NuGet &lt;strong&gt;EntityFramework.Migrations &lt;/strong&gt;como hasta ahora. En realidad, el funcionamiento es el mismo que hasta ahora, pero, con unos peque&amp;ntilde;os ligeros cambios en los comandos de power shell y la eliminaci&amp;oacute;n de la convenci&amp;oacute;n &lt;strong&gt;IncludeMetadataConvention&lt;/strong&gt;. Como siempre, lo mejor es verlo todo en la pr&amp;aacute;ctica o sea que vamos a ello. Crearemos, como hacemos habitualmente, un proyecto tonto de demo que nos permitir&amp;aacute; ir viendo cosillas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lo primero ser&amp;aacute; incluir el paquete de EF 4.3, puesto que es beta, al igual que se ha hecho con otros paquetes, tenemos que incluir en el comando de instalaci&amp;oacute;n la opcion &lt;strong&gt;IncludePreRelease &lt;/strong&gt;aunque tambi&amp;eacute;n suelen funcionar &lt;strong&gt;PreRelease&lt;/strong&gt; y &lt;strong&gt;Pre&lt;/strong&gt; simplemente.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/1_5F00_079355AD.png"&gt;&lt;img height="99" width="836" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/1_5F00_thumb_5F00_7D7EB481.png" alt="1" border="0" title="1" style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez inclu&amp;iacute;do el paquete de la beta, crearemos nuestra unidad de trabajo, un ejemplo sencillo, tal y como hacemos habitualmente:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Author&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Blog&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; AboutBlog { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; BlogEngineUnitOfWork&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    :DbContext&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Author&amp;gt; Authors { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Blog&amp;gt; Blogs { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tal y como sabr&amp;eacute;is todos a estas alturas, si utilizaramos la unidad de trabajo anterior, se nos generar&amp;iacute;a una nueva base de datos para el mode&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_21C39904.png"&gt;&lt;img height="269" width="644" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_thumb_5F00_2EBD7915.png" align="right" alt="2" border="0" title="2" style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;lo dado, ahora, este proceso ser&amp;aacute; el mismo, pero con un importante cambio y es que el proceso de creaci&amp;oacute;n de la base de datos se hace utilizando el API de Migrations, para ello basta con fijarse que ya no tenemos la tabla de metadata t&amp;iacute;pica y sin embargo, en las tablas de sistema podemos ver una nueva llamada &lt;strong&gt;__MigrationHistory, &lt;/strong&gt;tal y como se ven en la imagen de la derecha. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bueno, aunque esto sea as&amp;iacute;, por defecto, el sistema de migraciones no est&amp;aacute; habilitado en nuestros cambios de dominio, para ello, tenemos que ejecutar el comando &lt;strong&gt;Enable-Migrations&lt;/strong&gt;. Este comando, tiene el mismo efecto que ten&amp;iacute;a en anteriores versiones incluir el paquete de migraciones, es decir, nos agrega una nueva carpeta llamada Migrations en la que tendremos la configuraci&amp;oacute;n del sistema de migraciones y se incluir&amp;aacute; el c&amp;oacute;digo de las distintas migraciones que vayamos haciendo. En realidad aqu&amp;iacute; no hay nada nuevo a lo que ya conoc&amp;iacute;amos, aunque para ser sincero tampoco he revisado el conjunto de propiedades que &lt;strong&gt;DbMigrationsConfiguration&lt;/strong&gt; pone a nuestra disposici&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bien, una vez habilitadas las migraciones pasaremos a crear(actualizar) la base datos, otra vez, como ya sab&amp;iacute;amos tenemos el comando &lt;strong&gt;Update-Database&lt;/strong&gt; con sus diferentes opciones, os recomiendo mirar el &lt;strong&gt;get-help Update-Database &amp;ndash;detailed&lt;/strong&gt; para una completa informaci&amp;oacute;n de todo lo que podemos hacer. Por ahora, al habilitar las migraciones ya tendremos la base de datos generada y por lo tanto, el comando nos dir&amp;aacute; que no tiene tareas pendientes o sea que empezaremos agregando una nueva propiedad a &lt;strong&gt;Blog&lt;/strong&gt;, por ejemplo &lt;strong&gt;CreationDate&lt;/strong&gt;, como vemos en el siguiente fragmento.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Blog&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; AboutBlog { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime CreationDate { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una vez agregada esta propiedad, agregaremos una migraci&amp;oacute;n, para ello, usaremos otra vez el ya conocido comando Add-Migration, el cu&amp;aacute;l, incluye&amp;nbsp; en la carpeta de migraciones el c&amp;oacute;digo de la nueva migraci&amp;oacute;n, que yo he llamado AddedCreationDate y que contiene algo similar a lo siguiente:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; AddedCreationDate : DbMigration&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Up()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        CreateTable(&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#006080;"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            c =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Id = c.Int(nullable: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, identity: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Name = c.String(),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                })&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            .PrimaryKey(t =&amp;gt; t.Id);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        CreateTable(&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#006080;"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            c =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Id = c.Int(nullable: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, identity: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Title = c.String(),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    AboutBlog = c.String(),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    CreationDate = c.DateTime(nullable: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                })&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            .PrimaryKey(t =&amp;gt; t.Id);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Down()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        DropTable(&lt;span style="color:#006080;"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        DropTable(&lt;span style="color:#006080;"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Por supuesto, tambi&amp;eacute;n, como ya sabr&amp;aacute; de anteriores entradas podemos hacer otras tareas como la creaci&amp;oacute;n de &amp;iacute;ndices etc, como vemos en la lista de m&amp;eacute;todos que DbMigration pone a nuestra disposici&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AddColumn &lt;/li&gt;
&lt;li&gt;AddForeignKey &lt;/li&gt;
&lt;li&gt;AddPrimaryKey &lt;/li&gt;
&lt;li&gt;AlterColumn &lt;/li&gt;
&lt;li&gt;CreateIndex &lt;/li&gt;
&lt;li&gt;CreateTable &lt;/li&gt;
&lt;li&gt;DropColumn &lt;/li&gt;
&lt;li&gt;DropForeignKey &lt;/li&gt;
&lt;li&gt;DropIndex &lt;/li&gt;
&lt;li&gt;DropPrimaryKey &lt;/li&gt;
&lt;li&gt;DropTable &lt;/li&gt;
&lt;li&gt;MoveTable &lt;/li&gt;
&lt;li&gt;RenameColumn &lt;/li&gt;
&lt;li&gt;RenameTable &lt;/li&gt;
&lt;li&gt;Sql &lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;La nueva secci&amp;oacute;n de configuraci&amp;oacute;n&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como coment&amp;aacute;bamos&amp;nbsp; antes,aqu&amp;iacute; va el punto extra, y es que EF 4.3 pone a nuestra disposici&amp;oacute;n a una nueva &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx"&gt;secci&amp;oacute;n de configuraci&amp;oacute;n&lt;/a&gt;, &lt;strong&gt;EntityFrameworkSection&lt;/strong&gt;, gracias a la cual podremos configurar desde el DefaultConnectionFactory que queremos tener por defecto ( antes ten&amp;iacute;amos que recurrir a &lt;strong&gt;Database&lt;/strong&gt;.&lt;strong&gt;DefaultConnectionFactory&lt;/strong&gt; ) hasta los inicializadores que queremos tener por defecto. A continuaci&amp;oacute;n os pongo un fragmento de una secci&amp;oacute;n de configuraci&amp;oacute;n sobre un contexto de trabajo en el que se establece un inicializador y en la que adem&amp;aacute;s se establece una factoria de conexi&amp;oacute;n por defecto.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/4_5F00_1D7A4795.png"&gt;&lt;img height="411" width="644" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/4_5F00_thumb_5F00_09ECE7F4.png" alt="4" border="0" title="4" style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;lt;?xml version=&lt;span style="color:#006080;"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; encoding=&lt;span style="color:#006080;"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;lt;configuration&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &amp;lt;configSections&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &amp;lt;section name=&lt;span style="color:#006080;"&gt;&amp;quot;entityFramework&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         type=&lt;span style="color:#006080;"&gt;&amp;quot;System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &amp;lt;/configSections&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &amp;lt;entityFramework&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &amp;lt;defaultConnectionFactory type=&lt;span style="color:#006080;"&gt;&amp;quot;System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &amp;lt;parameters&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &amp;lt;parameter &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color:#006080;"&gt;&amp;quot;Data Source=.; Integrated Security=True; MultipleActiveResultSets=True&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &amp;lt;/parameters&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &amp;lt;/defaultConnectionFactory&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &amp;lt;contexts&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &amp;lt;context type=&lt;span style="color:#006080;"&gt;&amp;quot;MySample.UnitOfWork,MySample&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &amp;lt;databaseInitializer type=&lt;span style="color:#006080;"&gt;&amp;quot;MySample.MyCustomInitializer,MySample&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &amp;lt;/context&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &amp;lt;/contexts&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &amp;lt;/entityFramework&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como veis el equipo de ADO.NET est&amp;aacute; trabajando duro y esto es algo que podemos ver de forma temprana gracias a que los paquetes de EF nuevos no forman parte del Framework. Os imaginais que pasar&amp;iacute;a si EF se fuera a un modelo como el de &lt;strong&gt;MVC&lt;/strong&gt; en el que no tienen una dependencia con el framework&amp;hellip; ummmm&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos&lt;/p&gt;
&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202734" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.0/default.aspx">EF 4.0</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.x/default.aspx">EF 4.x</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.3/default.aspx">EF 4.3</category></item><item><title>P&amp;P y CQRS: Guía + implementación de ejemplo</title><link>http://geeks.ms/blogs/unai/archive/2012/01/12/p-amp-p-y-cqrs-gu-237-a-implementaci-243-n-de-ejemplo.aspx</link><pubDate>Thu, 12 Jan 2012 22:57:08 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202731</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202731</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202731</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2012/01/12/p-amp-p-y-cqrs-gu-237-a-implementaci-243-n-de-ejemplo.aspx#comments</comments><description>&lt;p&gt;Bueno, una entrada cortita, la gente de Patterns and Practices han lanzado una encuesta valorando los intereses y conocimientos de la gente referidos a CQRS. El caso es que Grigori, Eugenio, Cesar de la torre y compañia están preparando una guia y probablemente una implementación de ejemplo de &lt;strong&gt;CQRS&lt;/strong&gt; y quieren preguntarnos por nuestras inquietudes y preferencias antes de continuar…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si te gusta CQRS entra en la encuesta y participa, si te interesa o crees que es bueno esta nueva guia lo mismo, participa &lt;a href="http://www.surveymonkey.com/s/cqrsguide"&gt;aquí&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Gracias&lt;/p&gt;  &lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202731" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/DDD/default.aspx">DDD</category><category domain="http://geeks.ms/blogs/unai/archive/tags/CQRS/default.aspx">CQRS</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Survey/default.aspx">Survey</category></item><item><title>EF 4.X: Sql Federations</title><link>http://geeks.ms/blogs/unai/archive/2012/01/12/ef-4-x-sql-federations.aspx</link><pubDate>Thu, 12 Jan 2012 17:53:30 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202725</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202725</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202725</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2012/01/12/ef-4-x-sql-federations.aspx#comments</comments><description>&lt;p&gt;Para los que estéis al dia de todo lo que ocurre con &lt;strong&gt;Windows Azure&lt;/strong&gt; y las distintas features que están poniendo habréis visto que entre&lt;strong&gt; node.js&lt;/strong&gt;, &lt;strong&gt;linux&lt;/strong&gt; y otras lindezas se está planeando liberar una release de Sql Azure Federation, vamos, lo que toda la vida se ha llamado la capacidad de&lt;strong&gt; “sharding”&lt;/strong&gt; . Sino me equivoco, &lt;a href="http://www.geeks.ms/blogs/ilanda"&gt;Ibon&lt;/a&gt; estará más enterado que yo y podría corregirme, esta feature saldra en el&lt;strong&gt; Q4 del 2011&lt;/strong&gt;, es decir a finales de año. Llegados aquí, a muchos, yo entre ellos, se preguntarán si nos cambia algo la vida en cuanto al desarrollo y por supuesto, los que utilizamos un ORM como &lt;a href="http://blogs.msdn.com/adonet"&gt;EF&lt;/a&gt; nos lo preguntamos con mayor preocupación todavía. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Después de leer la &lt;a href="http://msdn.microsoft.com/en-us/library/ee336271.aspx"&gt;documentación&lt;/a&gt; y demás sobre como está formado Azure Federations la cosa se vuelve un poquito preocupante, sobre todo porque por ejemplo tendremos que renunciar a las capacidades que nos da EF para autogenerarnos una base de datos a partir del modelo, puesto que ahora, tendremos que especificar en la creación elementos como la federación etc, a mayores de crear la federación. Es decir, antes de generar la base de datos deberíamos tener cosas como las siguientes:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;CREATE FEDERATION FED_1 (range_id BIGINT RANGE) GO&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;USE FEDERATION FED_1 (range_id = 0) WITH FILTERING = OFF, RESET GO &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;div id="codeSnippetWrapper"&gt;
      &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;CREATE TABLE Orders&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;(&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    order_id bigint not &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;,&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    customer_id bigint,&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    total_cost money not &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;,&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    order_date datetime not &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;,&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    primary key (order_id, customer_id)&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;) FEDERATED ON (range_id = customer_id)&lt;/pre&gt;


        &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;GO&lt;/pre&gt;
&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bien, esto de por si ya implica una pequeña restricción, la pena, es que esta no es la única, puesto que en nuestras consultas tendremos que hacer un pequeño trabajo para establecer sobre que miembro del sharding pueden trabajar. Por suerte para nosotros, el grupo &lt;a href="http://windowsazurecat.com/index.php"&gt;Windows Azure Customer Advisory Team&lt;/a&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;strike&gt;&lt;em&gt;( tiene narices que la web sea php )&amp;#160; &lt;/em&gt;&lt;/strike&gt;ha creado un pequeño manual de como debemos de trabajar que sin duda nos será de mucha ayuda el cual lo podeís encontrar &lt;a href="http://windowsazurecat.com/2011/09/sql-azure-federations-entity-framework-code-first/"&gt;aquí&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que os sea de interés…&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202725" width="1" height="1"&gt;</description></item><item><title>RavenDB VII Consultas e indices estáticos..</title><link>http://geeks.ms/blogs/unai/archive/2011/12/20/ravendb-vii-consultas-e-indices-est-225-ticos.aspx</link><pubDate>Tue, 20 Dec 2011 18:26:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202260</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202260</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202260</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/20/ravendb-vii-consultas-e-indices-est-225-ticos.aspx#comments</comments><description>&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Map&lt;/h2&gt;
&lt;p&gt;En la anterior entrada hicimos la primera introducci&amp;oacute;n de lo que considero uno de los puntos fuertes, a mayores del API cliente, de &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; y este no es otro que su sistema de consultas. En esta entrada, hicimos una introducci&amp;oacute;n sobre los &amp;iacute;ndices que utiliza por detras &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; y que, como ya sabemos, se basan en &lt;a href="http://incubator.apache.org/lucene.net/"&gt;Lucene.NET&lt;/a&gt;. Pero, los &amp;iacute;ndices que vimos, eran din&amp;aacute;micos o bien generados autom&amp;aacute;ticamente por RavenDB, si detecta un numero alto de consultas sobre el temporal. Estos &amp;iacute;ndinces din&amp;aacute;micos no suelen ser una buena soluci&amp;oacute;n porque pueden tener una &lt;strong&gt;alta latencia, &lt;/strong&gt;se ejecutan al vuelo y por lo tanto pueden tener un tiempo de ejecuci&amp;oacute;n alto, y &lt;strong&gt;no&lt;/strong&gt; son demasiado &lt;strong&gt;flexibles&lt;/strong&gt; en cuanto a las necesidades que podemos tener, trabajo con datos espaciales, b&amp;uacute;squedas de texto completo, proyecciones etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un &amp;iacute;ndice est&amp;aacute;tico no es m&amp;aacute;s que la definici&amp;oacute;n de&amp;nbsp; una estructura llamada&lt;strong&gt; Raven.Abstractions.Indexing.IndexDefinition &lt;/strong&gt;cuyo cuerpo podemos ver a continuaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; IndexDefinition&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IndexDefinition();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; Analyzers { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; Fields { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, FieldIndexing&amp;gt; Indexes { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsCompiled { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsMapReduce { get; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsTemp { get; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Map { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; HashSet&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; Maps { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Reduce { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, SortOptions&amp;gt; SortOptions { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, FieldStorage&amp;gt; Stores { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; TransformResults { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Type { get; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Equals(IndexDefinition other);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; obj);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; GetHashCode();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] GetIndexHash();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; RemoveDefaultValues();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si observa la definici&amp;oacute;n anterior, hay una serie de puntos muy interesantes, como son los miembros &lt;strong&gt;Map&lt;/strong&gt;, &lt;strong&gt;Reduce&lt;/strong&gt;, &lt;strong&gt;TransformResult&lt;/strong&gt; y &lt;strong&gt;Analyzers. &lt;/strong&gt;A lo largo de esta entrada, intentaremos, aunque sea de forma somera, ver todos y cada uno de ellos, seguramente junt&amp;aacute;ndolos con alg&amp;uacute;n otro elemento necesario. Aunque es posible crear directamente esta estructura, por lo general, la misma se suele crear a partir de una clase llamada &lt;strong&gt;IndexDefinitionBuilder&lt;/strong&gt;, como podemos ver en el siguiente ejemplo de c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    store.DatabaseCommands.PutIndex(&lt;span style="color:#006080;"&gt;&amp;quot;PostByTitle&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; IndexDefinitionBuilder&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Map = posts =&amp;gt; from p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; posts&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                       select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { p.Title }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    });&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con esto acabamos de ordenar al servidor de &lt;a href="http://wwww.ravendb.net"&gt;RavenDB&lt;/a&gt; crear un nuevo &amp;iacute;ndice, llamado PostByTitle,sobre la colecci&amp;oacute;n de posts, utilizando para ellos los m&amp;eacute;todos de comandos de base de datos que nos ofrece nuestra interface &lt;strong&gt;IDocumentStore&lt;/strong&gt;.&amp;nbsp; Para el &amp;iacute;ndice anterior podemos ver como hacer la b&amp;uacute;squeda de los documentos que nos interesan y a mayores sobre que campos vamos a hacer la b&amp;uacute;squeda de nuestros documentos, en este caso solamente la propiedad &lt;strong&gt;Title&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ahora, si quisi&amp;eacute;ramos hacer una consulta sobre este &amp;iacute;ndice podr&amp;iacute;amos hacer algo tal cual lo que vemos en el siguiente tip de c&amp;oacute;digo:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;RavenQueryStatistics statistcs;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;var result = session.Query&amp;lt;Post&amp;gt;(&lt;span style="color:#006080;"&gt;&amp;quot;PostByTitle&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    .Statistics(&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; statistcs)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    .Where(p =&amp;gt; p.Title != &lt;span style="color:#006080;"&gt;&amp;quot;O bruxo mobile...&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    .Take(100)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    .ToList();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Analyzers&lt;/h2&gt;
&lt;p&gt;Bueno, parece que m&amp;aacute;s o menos est&amp;aacute; claro, sin embargo, seguro que a muchos se os ocurren algunas preguntas. La primera que a mi me vino a la mano, es como es la creaci&amp;oacute;n de ese &amp;iacute;ndice en el campo Title, es decir, la &lt;strong&gt;tokenizaci&amp;oacute;n&lt;/strong&gt; de los valores se puede hacer de muchas maneras, desechando terminos terminales, pudiendo poner sin&amp;oacute;nimos, etc&amp;hellip;. Seguramanete, esta pregunta me la hice porque no conoc&amp;iacute;a demasiado bien el concepto de &lt;a href="http://www.aaron-powell.com/lucene-analyzer"&gt;Analizadores en Lucene.NET&lt;/a&gt;. Pues bien, una vez comprendidos los analizadores la siguiente pregunta es ver &amp;iquest;como podemos decirle a los &amp;iacute;ndices de &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; que ciertos campos est&amp;eacute;n marcados por un analizador? Pues si revisamos el codigo de creaci&amp;oacute;n de nuestro &amp;iacute;ndice podemos ver lo sencillo que resulta esta tarea, como se puede ver a continuaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;store.DatabaseCommands.PutIndex(&lt;span style="color:#006080;"&gt;&amp;quot;PostByTitle&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; IndexDefinitionBuilder&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Map = posts =&amp;gt; from p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; posts&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                   select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { p.Title },&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Analyzers =&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {pp=&amp;gt;pp.Title,&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(StandardAnalyzer).FullName}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Observe como el diccionario Analyzers nos permite, de una forma bastante sencilla, incorporar una analizador espec&amp;iacute;fico a uno de los campos del &lt;strong&gt;Map&lt;/strong&gt;. Puesto que nos pide el nombre de un tipo de analizador una forma sencilla de hacerlo sin tener que acordarse de todo el fullname es referenciar al tipo y extraer su &lt;strong&gt;FullName&lt;/strong&gt;. Este tipo, est&amp;aacute; en la librer&amp;iacute;a &lt;strong&gt;Lucene.NET&lt;/strong&gt; que tendr&amp;aacute; que referenciar puesto que no forma parte del &lt;strong&gt;API&lt;/strong&gt; cliente de &lt;strong&gt;&lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bien, puesto que seguramente, si ha seguido este post y ha modificado el &amp;iacute;ndice se habr&amp;aacute; dado cuenta de que una vez creado no podemos volver a ejecutar &lt;strong&gt;PutIndex&lt;/strong&gt;, puesto que esto falla, al existir uno l&amp;oacute;gicamente. Para prevenir estos casos y hacer el bootstraping de los &amp;iacute;ndices de una forma m&amp;aacute;s sencilla, &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; nos ofrece un mecanismo alternativo que pasaremos a comentar a continuaci&amp;oacute;n.&amp;nbsp; Con el fin de facilitar la definici&amp;oacute;n y reutilizaci&amp;oacute;n de indices RavenDB nos propone definir los mismos en una clase que extienda &lt;strong&gt;AbstractIndexCreationTask&amp;lt;TDocument&amp;gt; &lt;/strong&gt;como por ejemplo podr&amp;iacute;a ser la siguiente:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; PostByTitleIndex&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    :AbstractIndexCreationTask&amp;lt;Post&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; PostByTitleIndex()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Map = posts =&amp;gt; from p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; posts&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                       select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { p.Title };&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Analyzers.Add(pp =&amp;gt; pp.Title, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(StandardAnalyzer).FullName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ahora, para hacer el botstrapper solamente tendr&amp;iacute;amos que ejecutar la siguiente instrucci&amp;oacute;n, sin preocuparnos si los indices son nuevos, modificaciones de los existentes o ya existen con esa misma definici&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;IndexCreation.CreateIndexes(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(PostByTitleIndex).Assembly, store);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Reduce&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con lo anterior, aunque no sea muy profundamente, ya hemos terminado la parte referida al Map, pero como ya seguramente sabr&amp;aacute;, y hemos dicho, esta no es la &amp;uacute;nica parte importante de un &amp;iacute;ndice puesto que tambi&amp;eacute;n podemos especificar una funci&amp;oacute;n de &lt;strong&gt;Reduce. &lt;/strong&gt;En palabras parcas, un Reduce es una paso posterior a la selecci&amp;oacute;n o mapeo de documentos, sobre la podemos hacer opero tstaciones ( asociativas ) de agregaci&amp;oacute;n. A mayores, la idea es que estas operaciones se puedan hacer sobre subconjuntos de los seleccionados, con el fin de paralelizarlas, por eso la consideraci&amp;oacute;n de que sean asociativas las funciones de agregaci&amp;oacute;n. Hay una muy buena referencia visual acerca de cual es la teor&amp;iacute;a de &lt;a href="http://ayende.com/blog/4435/map-reduce-a-visual-explanation"&gt;Map/Reduce&lt;/a&gt; en este post que seguro le introducir&amp;aacute; en este aspecto de buena manera.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una vez que nos hemos preocupado por saber que es un &lt;strong&gt;Reduce&lt;/strong&gt;, concepto que por supuesto tenemos en todas las bases de datos documentales como &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.mongodb.org"&gt;MongoDB&lt;/a&gt;, por ejemplo, pasaremos a ver alg&amp;uacute;n ejemplo de esta caracter&amp;iacute;stica. Supongamos por ejemplo que deseamos obtener la suma de los comentarios agrupadas por identificador de blog, puesto que la &lt;strong&gt;&amp;ldquo;cuenta&amp;rdquo; &lt;/strong&gt;es una operaci&amp;oacute;n asociativa, podr&amp;iacute;amos crear un &amp;iacute;ndice como sigue:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CountByBlogIdIndex&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    : AbstractIndexCreationTask&amp;lt;Post, RavenStaticIndex.CountByBlogIdIndex.CountByBlogIdIndexReduceResult&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CountByBlogIdIndexReduceResult&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; BlogId { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Count { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CountByBlogIdIndex()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Map = posts =&amp;gt; from p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; posts&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                       select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { p.BlogId,p.Comments.Count };&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Reduce = result =&amp;gt; from r &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; result&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                           group r by r.BlogId&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                           into temp&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                           select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { BlogId = temp.Key, Count = temp.Sum(rr=&amp;gt;rr.Count) };&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y podr&amp;iacute;amos consultar esto de la siguiente forma en el API de &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IndexCreation.CreateIndexes(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(CountByBlogIdIndex).Assembly, store);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    RavenQueryStatistics statistcs;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var result = session.Query&amp;lt;RavenStaticIndex.CountByBlogIdIndex.CountByBlogIdIndexReduceResult, CountByBlogIdIndex&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        .Statistics(&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; statistcs)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        .Take(100)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        .ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bueno, creo que son ya bastantes cosas como para ponerse a jugar sin esperar m&amp;aacute;s no?? yo creo que si, o sea que dejaremos para otra entrada algunas cosillas que nos faltan como multi-maps, funciones de transformaci&amp;oacute;n etc. etc..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos&lt;/p&gt;
&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202260" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>Raven DB VI, La hora de las consultas…</title><link>http://geeks.ms/blogs/unai/archive/2011/12/19/raven-db-vi-la-hora-de-las-consultas.aspx</link><pubDate>Mon, 19 Dec 2011 18:12:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202215</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202215</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202215</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/19/raven-db-vi-la-hora-de-las-consultas.aspx#comments</comments><description>&lt;p&gt;Por fin,&amp;nbsp; seguro que ha sido la frase de muchos al oir que ya lleg&amp;aacute;bamos a las consultas&amp;hellip; Bien, pues si, con esta entrada inauguramos el trabajo con las consultas en RavenDB. Despu&amp;eacute;s ya de unos cuantos posts sobre el tema creo que ya es hora de tocar una de las cosas m&amp;aacute;s importantes y que mejor hace RavenDB, que es las consultas.&lt;/p&gt;
&lt;p&gt;Como siempre, ponemos un peque&amp;ntilde;o modelo de clase para realizar los distintos ejemplos. En esta occasion reutilizaremos las tipicas Blog, Post y Comment que ya hemos visto otras veces, y daremos por supuesto que tenemos ya una cantidad de documentos inclu&amp;iacute;dos en RavenDB antes de procesar las consultas.&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Blog&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; About { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Post&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; BlogId { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Body { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Comment&amp;gt; Comments { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Comment&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Author { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;* Como ya se ha comentado alguna vez, los modelos de las entradas tienen una finalidad lectiva y por lo tanto no se tiene porque ajustar a la realidad&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-US" style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="color:#000000;"&gt;Por defecto, y en la pr&amp;aacute;ctica, toda consulta que hacemos a RavenDB representa un &amp;iacute;ndice sobre el almacen de RavenDB utilizando el proyecto &lt;a href="http://incubator.apache.org/lucene.net/"&gt;Lucene .NET&lt;/a&gt;. Lucene, es un motor de b&amp;uacute;squeda basado en .NET, en realidad es un port de java, basado en un &lt;a href="http://lucene.sourceforge.net/talks/pisa/"&gt;&amp;iacute;ndice invertido&lt;/a&gt; que funciona realmente r&amp;aacute;pido y dispone de muchas caracter&amp;iacute;sticas importantes.&amp;nbsp; Por suerte, RavenDB no nos obliga a conocer la sintaxis de Lucene, aunque aprendiendo Lucene entender&amp;iacute;amos muchos de los comportamientos del motor de consultas, puesto que nos ofrece un&lt;strong&gt; completo soporte de Linq, &lt;/strong&gt;pudiendo escribir todas nuestras consultas en &lt;strong&gt;Linq&lt;/strong&gt; y dejando al API de cliente que se encargue de la traducci&amp;oacute;n de las mismas a la sintaxis de &lt;strong&gt;Lucene&lt;/strong&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-US" style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-US" style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="color:#000000;"&gt;Con el fin de mostrar el primer ejemplo, supongamos el siguiente c&amp;oacute;digo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-US" style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var post = (from c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; session.Query&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; c.Title != &lt;span style="color:#006080;"&gt;&amp;quot;RavenDB&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                select c).ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style="font-family:Calibri;color:#000000;"&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;En la consulta anterior podemos ver un ejemplo de consulta din&amp;aacute;mica tal cual la podr&amp;iacute;amos hacer contra otro almac&amp;eacute;n como una colecci&amp;oacute;n de objetos o una tabla con EF. L&amp;oacute;gicamente, esta consulta genera una petici&amp;oacute;n &lt;strong&gt;http&lt;/strong&gt; al servidor de RavenDB, en concreto, la siguiente petici&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;GET &lt;a href="http://ravenserver/indexes/dynamic/Posts?query=-Title%253ARavenDB%2520AND%2520Title%253A*&amp;amp;start=0&amp;amp;pageSize=128&amp;amp;aggregation=None"&gt;http://ravenserver/indexes/dynamic/Posts?query=-Title%253ARavenDB%2520AND%2520Title%253A*&amp;amp;start=0&amp;amp;pageSize=128&amp;amp;aggregation=None&lt;/a&gt; HTTP/1.1 &lt;br /&gt;Accept-Encoding: deflate,gzip &lt;br /&gt;Content-Type: application/json; charset=utf-8&lt;/p&gt;
&lt;p&gt;Si examinamos la trama podemos observar los siguientes elementos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por defecto, las consultas se hacen sobre un indice, en este caso, como no hemos especificado cual se hace sobre un &amp;iacute;ndice din&amp;aacute;mico&lt;/li&gt;
&lt;li&gt;Por defecto las consultas nos protegen contra resultados potencialmente grande, agregando por defecto un par&amp;aacute;metro llamado &lt;strong&gt;pageSize&lt;/strong&gt; , cuyo valor por defecto es 128.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_23299642.png"&gt;&lt;img height="297" width="644" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_68CE2060.png" align="right" alt="Untitled" border="0" title="Untitled" style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bien, la primera condici&amp;oacute;n era algo que ya sab&amp;iacute;amos, es decir, si RavenDB est&amp;aacute; basado en Lucene tiene que existir alg&amp;uacute;n tipo de &amp;iacute;ndece. RavenDB, puede generar un &amp;iacute;ndice din&amp;aacute;mico para aquellas consultas que no se hacen sobre un &amp;iacute;ndice est&amp;aacute;tico. A mayores, si considera que se ha utilizado una consulta un numero alto de veces, podr&amp;iacute;a materializar el indice din&amp;aacute;mico en un &amp;iacute;ndice est&amp;aacute;tico. Para provocarlo, realize esa consulta un n&amp;uacute;mero de veces y dir&amp;iacute;jase a nuestra herramienta de administraci&amp;oacute;n de RavenDB, Raven Management Studio y podr&amp;aacute; ver algo similar a lo mostrado en la imagen de la derecha. Por supuesto, m&amp;aacute;s adelante veremos como crear los &amp;iacute;ndices de forma est&amp;aacute;tica.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El otro punto que hac&amp;iacute;amos notar es como RavenDB por defecto nos proteg&amp;iacute;a de las consultas potencialmente grandes restringiendo el n&amp;uacute;mero de resultados a 128, puesto que, por defecto el valor de &lt;strong&gt;pageSize&lt;/strong&gt; es este. Si, nosotros queremos traer un conjunto mayor de resultados podr&amp;iacute;amos hacer uso de este operador en la consulta,&amp;nbsp; de forma similar a como vemos a continuaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var post = session.Query&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Where(c=&amp;gt;c.Title != &lt;span style="color:#006080;"&gt;&amp;quot;RavenDB&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Take(200)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Otro nivel de protecci&amp;oacute;n que se incluye en RavenDB es que, por defecto, tampoco nos permite obtener m&amp;aacute;s de 1000 resultados por consulta. En este caso, la protecci&amp;oacute;n no est&amp;aacute; en el cliente sino en el servidor y por lo tanto, modificar esto no es tan sencillo como acabamos de ver con el operador Take. Para hacerlo, tenemos que incluir en la configuraci&amp;oacute;n del servidor una nueva clave de configuraci&amp;oacute;n que se llama &lt;strong&gt;MaxPageSize&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;lt;add key=&lt;span style="color:#006080;"&gt;&amp;quot;Raven/MaxPageSize&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color:#006080;"&gt;&amp;quot;2000&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A mayores, y como elemento de valor, RavenDB incluye algunos m&amp;eacute;todos de extensi&amp;oacute;n a nuestras consultas que nos permitir&amp;aacute;n desde customizar las consultas hasta obtener informaci&amp;oacute;n acerca de las mismas. El primero de los m&amp;eacute;todos que veremos es &lt;strong&gt;Statistics&lt;/strong&gt;, gracias al cual podremos obtener informaci&amp;oacute;n acerca del n&amp;uacute;mero total de documentos en la base de datos y otra informaci&amp;oacute;n de valor.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    RavenQueryStatistics statistics;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var post = session.Query&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Statistics(&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; statistics)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Where(c=&amp;gt;c.Title != &lt;span style="color:#006080;"&gt;&amp;quot;RavenDB&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Take(200)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_404F3E4C.png"&gt;&lt;img height="247" width="855" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_thumb_5F00_0C3A9EF9.png" align="right" alt="Untitled2" border="0" title="Untitled2" style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RavenQueryStatistics&lt;/strong&gt;, nos ofrece, como puede observar, la siguiente informaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El nombre del &amp;iacute;ndice que se ha utilizado en la consulta&lt;/li&gt;
&lt;li&gt;Si los datos son state&lt;/li&gt;
&lt;li&gt;El n&amp;uacute;mero total de documentos en la base de datos&lt;/li&gt;
&lt;li&gt;El n&amp;uacute;mero de documentos omitidos ( hablaremos sobre esto)&lt;/li&gt;
&lt;li&gt;La fecha de ejecuci&amp;oacute;n del &amp;iacute;ndice&lt;/li&gt;
&lt;li&gt;La fecha, a partir de la cual los datos son state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un elemento importante de estas estad&amp;iacute;sticas es el de &lt;strong&gt;SkippedResults. &lt;/strong&gt;Este valor nos ofrece la informaci&amp;oacute;n de aquellos elementos que no se han tenido en cuenta para calcular el n&amp;uacute;mero total de resultados. Por ejemplo porque se ha aplicado una cla&amp;uacute;sula &lt;strong&gt;Distinct&lt;/strong&gt;. Con esto, queremos decir que por ejemplo, si estamos paginando y hemos obtenido una primera pagina, incluyendo 5 en el valor de SkippedResults la siguiente p&amp;aacute;gina tendria que pedirse de la siguiente forma:&lt;strong&gt; pageCount + SkippedResults.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Otro de los m&amp;eacute;todos que podemos incluir en nuestras consultas es el m&amp;eacute;todo de &lt;strong&gt;Customize&lt;/strong&gt;. En esta ocasi&amp;oacute;n, este m&amp;eacute;todo no nos permite obtener m&amp;aacute;s informaci&amp;oacute;n sino que, nos permite customizar cierto grado de comportamiento de nuestras consultas. Im&amp;aacute;ginese por ejemplo que usted en una consulta din&amp;aacute;mica no puede permitirse la consulta de datos &lt;strong&gt;state,&lt;/strong&gt;&amp;nbsp; pues bien, con Customize podemos indicar esto de una forma sencilla.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    RavenQueryStatistics statistics;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var post = session.Query&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Statistics(&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; statistics)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Customize(dqc=&amp;gt;dqc.WaitForNonStaleResultsAsOfNow())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Skip(0)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Take(10)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si observa durante un momento los m&amp;eacute;todos de los que disponemos en &lt;strong&gt;IDocumentQueryCustomization&lt;/strong&gt; , el tipo del par&amp;aacute;metro de entrada en la Action que establecemos en Customize, podemos ver que disponemos de diferentes sobrecargas y posibilidades para la espera de resultados no state.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WaitForNonStaleResultsAsOf&lt;/strong&gt;: Nos permite establecer una fecha de corte, que l&amp;oacute;gicamente no tiene porque ser en este momento, para el cual los datos no puedan ser stale. Por supuesto, tambi&amp;eacute;n nos permite indicar un tiempo m&amp;aacute;ximo de espera.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WaitForNonStaleResultsAsOfNow: &lt;/strong&gt;Nos permite especificar la fecha de corte como ahora.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WaitForNonStaleResultsAsOfLastWrite: &lt;/strong&gt;Nos permite especificar la fecha de corte como la &amp;uacute;ltima en la que se ha escrito por parte de la aplicaci&amp;oacute;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WaitForNonStaleResults&lt;/strong&gt;: Nos permite indicar que el procesado de la query debe de esperar por resultados no stale. Podemos indicar un tiempo m&amp;aacute;ximo de espera si deseamos no estar bloqueando at infinitum. Solamente se suele utilizar dentro de tests unitarios, tiene demasiadas implicaciones como para que exista su uso fuera de este &amp;aacute;mbito.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;La propina&lt;/h3&gt;
&lt;p&gt;Bueno, la entrada ya se acerca a su final. En la misma, hemos visto los principios de las consultas en RavenDB y los &amp;iacute;ndices din&amp;aacute;micos. Para la siguiente entrada, hablaremos acerca de los &amp;iacute;ndices est&amp;aacute;ticos, funciones map-reduce y analizadores. No obstante me gustar&amp;iacute;a dejar una peque&amp;ntilde;a propina&amp;hellip;. f&amp;iacute;jese en el siguiente c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName=&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var post = session.Query&amp;lt;Post&amp;gt;()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .Include(p =&amp;gt; p.BlogId)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                      .ToList();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Al igual que el m&amp;eacute;todo Include en EF, este m&amp;eacute;todo nos permite en RavenDB indicarle que adem&amp;aacute;s de la carga de los documentos de la consulte carge adicionalmente la referencia indicada, en nuestro caso el blog asociado, de esta manera, tras el siguiente request:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;GET &lt;a href="http://ravenserver/indexes/dynamic/Posts?query=&amp;amp;start=0&amp;amp;pageSize=128&amp;amp;aggregation=None&amp;amp;include=BlogId"&gt;http://ravenserver/indexes/dynamic/Posts?query=&amp;amp;start=0&amp;amp;pageSize=128&amp;amp;aggregation=None&amp;amp;include=BlogId&lt;/a&gt; HTTP/1.1 &lt;br /&gt;Accept-Encoding: deflate,gzip &lt;br /&gt;Content-Type: application/json; charset=utf-8&lt;/p&gt;
&lt;p&gt;Podemos ver los siguientes resultados,&amp;nbsp; d&amp;oacute;nde adem&amp;aacute;s de los post correspondientes se incluyen los &lt;strong&gt;Blogs&lt;/strong&gt; referenciados.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK &lt;br /&gt;Cache-Control: private &lt;br /&gt;Content-Type: application/json; charset=utf-8 &lt;br /&gt;ETag: c171861e-497b-1bc0-a8c1-78c1da9f6070 &lt;br /&gt;Server: Microsoft-IIS/7.5 &lt;br /&gt;Raven-Server-Build: 573 &lt;br /&gt;X-AspNet-Version: 4.0.30319 &lt;br /&gt;Persistent-Auth: true &lt;br /&gt;X-Powered-By: ASP.NET &lt;br /&gt;Date: Mon, 19 Dec 2011 18:08:59 GMT &lt;br /&gt;Content-Length: 1589&lt;/p&gt;
&lt;p&gt;{&amp;quot;Results&amp;quot;:[{&amp;quot;BlogId&amp;quot;:&amp;quot;blogs/1&amp;quot;,&amp;quot;Title&amp;quot;:&amp;quot;The curegame, making off!&amp;quot;,&amp;quot;Body&amp;quot;:&amp;quot;This is the first post about thecuregame..&amp;quot;,&amp;quot;Comments&amp;quot;:[],&amp;quot;@metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Posts&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenQueryI.Post, RavenQueryI&amp;quot;,&amp;quot;@id&amp;quot;:&amp;quot;posts/1&amp;quot;,&amp;quot;Temp-Index-Score&amp;quot;:1.0,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-19T17:06:05.6520000&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0500-0000-000000000005&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false}},{&amp;quot;BlogId&amp;quot;:&amp;quot;blogs/2&amp;quot;,&amp;quot;Title&amp;quot;:&amp;quot;The curegame, making off!&amp;quot;,&amp;quot;Body&amp;quot;:&amp;quot;For me, this is the first entry about...&amp;quot;,&amp;quot;Comments&amp;quot;:[],&amp;quot;@metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Posts&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenQueryI.Post, RavenQueryI&amp;quot;,&amp;quot;@id&amp;quot;:&amp;quot;posts/2&amp;quot;,&amp;quot;Temp-Index-Score&amp;quot;:1.0,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-19T17:06:05.6520000&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0500-0000-000000000006&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false}}],&amp;quot;Includes&amp;quot;:[{&amp;quot;Title&amp;quot;:&amp;quot;O Bruxo mobile!&amp;quot;,&amp;quot;About&amp;quot;:&amp;quot;About this blog post...&amp;quot;,&amp;quot;@metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Blogs&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenQueryI.Blog, RavenQueryI&amp;quot;,&amp;quot;@id&amp;quot;:&amp;quot;blogs/1&amp;quot;,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-19T17:03:56.0000000&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0400-0000-000000000002&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false}},{&amp;quot;Title&amp;quot;:&amp;quot;La masa, el ladrillo, la bota y el bocadillo!&amp;quot;,&amp;quot;About&amp;quot;:&amp;quot;About this blog post...&amp;quot;,&amp;quot;@metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Blogs&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenQueryI.Blog, RavenQueryI&amp;quot;,&amp;quot;@id&amp;quot;:&amp;quot;blogs/2&amp;quot;,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-19T17:03:56.0000000&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0400-0000-000000000003&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false}}],&amp;quot;IsStale&amp;quot;:false,&amp;quot;IndexTimestamp&amp;quot;:&amp;quot;2011-12-19T17:06:05.6520000&amp;quot;,&amp;quot;TotalResults&amp;quot;:2,&amp;quot;SkippedResults&amp;quot;:0,&amp;quot;IndexName&amp;quot;:&amp;quot;Temp/Posts&amp;quot;,&amp;quot;IndexEtag&amp;quot;:&amp;quot;00000000-0000-0500-0000-000000000006&amp;quot;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos y hasta la siguiente entrada,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202215" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>RavenDB(V) Actualizaciones, concurrencia, patch y otras hierbas</title><link>http://geeks.ms/blogs/unai/archive/2011/12/15/ravendb-v-actualizaciones-concurrencia-patch-y-otras-hierbas.aspx</link><pubDate>Thu, 15 Dec 2011 20:05:16 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202162</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202162</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202162</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/15/ravendb-v-actualizaciones-concurrencia-patch-y-otras-hierbas.aspx#comments</comments><description>&lt;p&gt;En esta quinta entrega de la serie, puede ver las anteriores entradas aquí, &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/01/ravendb-i-empezamos.aspx"&gt;I&lt;/a&gt;,-&lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx"&gt;II&lt;/a&gt;-&lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/09/ravendb-iii-sobre-la-metadata-y-la-serializaci-243-n-de-los-documentos.aspx"&gt;III&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/12/ravendb-iv-la-identidad-de-los-documentos.aspx"&gt;IV&lt;/a&gt;, vamos a hablar sobre actualizaciones y los mecanismos de gestión de la concurrencia que tenemos, por supuesto intentando bajar lo más posible, para mi estas entradas son también una fuente de aprendizaje. Empezaremos la casa por dónde debemos, o sea que lo primero que haremos será hacer una pequeña inserción de un documento más o menos complejo, ya que esto nos dará juego para alguna cosa interesante, basado en las siguientes clases que podemos ver a continuación:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h4&gt;Actualizaciones&lt;/h4&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Post&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Id { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Body { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Comment&amp;gt; Comments { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Comment&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; UserName { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;En concreto, la inserción la haremos con los siguientes datos:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; }.Initialize())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentSession session = store.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    session.Store(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Post()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Title = &lt;span style="color:#006080;"&gt;&amp;quot;RavenDB(V): actualizaciones, concurrencia y otras hierbas!&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Body = &lt;span style="color:#006080;"&gt;&amp;quot;En esta quinta entrega de la serie, puede ver las ....&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Comments = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Comment&amp;gt;()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Comment()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                UserName = &lt;span style="color:#006080;"&gt;&amp;quot;preguntoncojonero&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                Text = &lt;span style="color:#006080;"&gt;&amp;quot;cualquier pregunta....&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    });&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    session.SaveChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Bien, llega la hora de empezar a hablar de actualizaciones. Como ya dijimos en la primera&amp;#160; introducción a &lt;a&gt;RavenDB&lt;/a&gt;, este ha sido creado apoyándose en patrones y experiencias provenientes de ORMs, muy especialmente de &lt;strong&gt;NHibernate&lt;/strong&gt;, aunque algo también hay de otros….Uno de estos patrones recogidos de frameworks como NH o EF es &lt;strong&gt;&lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;UnitOfWork&lt;/a&gt;&lt;/strong&gt;, el cual a estas alturas seguro que todos conocemos… Por lo tanto si un &lt;strong&gt;IDocumentSession&lt;/strong&gt; es un &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;UnitOfWork&lt;/a&gt; entonces la actualización de un documento debería de ser tan facil como lo siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;var post = session.Load&amp;lt;Post&amp;gt;(&lt;span style="color:#006080;"&gt;&amp;quot;posts/1&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;post.Comments.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Comment()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    UserName =&lt;span style="color:#006080;"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    Text = &lt;span style="color:#006080;"&gt;&amp;quot;Pues efectivamente preguntoncojonero...&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;});&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;session.SaveChanges();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Aunque por ahora seguimos sin hablar de la parte de consulta, fíjese en le método &lt;strong&gt;Load&lt;/strong&gt;, el cual, como seguramente habrá deducido, nos permite obtener un documento en función de su clave, en este caso, estamos utilizando la convención por defecto ( HiLo ). Si miráramos con Fiddler este proceso la primera entrada sería precisamente esta carga:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;GET &lt;a href="http://ravendbserver/docs/posts/1"&gt;http://ravendbserver/docs/posts/1&lt;/a&gt; HTTP/1.1 

  &lt;br /&gt;Accept-Encoding: deflate,gzip 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Host: portblackcode 

  &lt;br /&gt;Connection: Keep-Alive&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Ahora, puesto que cualquier &lt;strong&gt;IDocumentSession&lt;/strong&gt; es un &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;UnitOfWork&lt;/a&gt;, cualquier cambio en cualquier objeto consultado, y por lo tanto trackeado por la infraestructura de &lt;a&gt;RavenDB&lt;/a&gt;, es llevado al servidor una vez realizada la llamada a &lt;strong&gt;SaveChanges&lt;/strong&gt;, todos los cambios,inserciones,etc de una sesión se hacen en batch para reducir roundtrips.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;POST &lt;a href="http://portblackcode/bulk_docs"&gt;http://ravendbserver/bulk_docs&lt;/a&gt; HTTP/1.1 

  &lt;br /&gt;Accept-Encoding: deflate,gzip 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Host: portblackcode 

  &lt;br /&gt;Content-Length: 513 

  &lt;br /&gt;Expect: 100-continue&lt;/p&gt;

&lt;p&gt;[{&amp;quot;Key&amp;quot;:&amp;quot;posts/1&amp;quot;,&amp;quot;Method&amp;quot;:&amp;quot;PUT&amp;quot;,&amp;quot;Document&amp;quot;:{&amp;quot;Title&amp;quot;:&amp;quot;RavenDB(V): actualizaciones, concurrencia y otras hierbas!&amp;quot;,&amp;quot;Body&amp;quot;:&amp;quot;En esta quinta entrega de la serie, puede ver las ....&amp;quot;,&amp;quot;Comments&amp;quot;:[{&amp;quot;UserName&amp;quot;:&amp;quot;preguntoncojonero&amp;quot;,&amp;quot;Text&amp;quot;:&amp;quot;cualquier pregunta....&amp;quot;},{&amp;quot;UserName&amp;quot;:&amp;quot;Unai&amp;quot;,&amp;quot;Text&amp;quot;:&amp;quot;Pues efectivamente preguntoncojonero...&amp;quot;}]},&amp;quot;Metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Posts&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;sampleupdate.Post, sampleupdate&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0200-0000-000000000001&amp;quot;,&amp;quot;Last-Modified&amp;quot;:&amp;quot;\/Date(1323811962000+0100)\/&amp;quot;}}]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Fijese en la traza anterior como el cuerpo de nuestro &lt;strong&gt;POST&lt;/strong&gt; contiene la información de la operación a realizar y el nuevo documento a establecer en &lt;a&gt;RavenDB&lt;/a&gt;. Esto es una nota muy importante, es decir, es &lt;strong&gt;todo &lt;/strong&gt;el documento que vamos a modificar &lt;strong&gt;no es la modificación en si. &lt;/strong&gt;Esto, por ejemplo, tiene mucho impacto cuando estamos hablando de concurrencia, en concreto de gestión de concurrencia optimista, porque si dos personas incluyen un comentario en un post de forma concurrente &lt;strong&gt;podríamos tener problemas. &lt;/strong&gt;Esto es una de las cosas que quizás mas impacta con respecto a lo que sabemos de modelos relaciones, ¿un problema de concurrencia en una inserción, porque en realidad es lo que estamos haciendo??…&amp;#160; Pues si, ahora no hay tablas y filas, hay un documento, una estructura compleja, que cambia, y cambia, en este caso, completamente, por lo tanto, si tenemos dos personas insertando un comentario sino manejamos el problema de concurrencia podríamos perder comentarios….&lt;/p&gt;

&lt;h4&gt;Concurrencia y ETag&lt;/h4&gt;

&lt;p&gt;Como podemos solventar el caso anterior, o más bien, como podemos enterarnos de un posible problema de concurrencia??? Bueno, a estas alturas ya todos sabemos que &lt;a href="http://www.ravendb.net/"&gt;RavenDB&lt;/a&gt; es Restfull ¿verdad? y los que sabéis de http sabéis que existe el concepto de &lt;strong&gt;ETag&lt;/strong&gt; para identificar un estado de un recurso en un momento dado. Pues bién, &lt;a&gt;RavenDB&lt;/a&gt; utiliza este mismo concepto para gestionar la concurrencia de los documentos. Si volvemos a fijarnos en la trama de actulización veremos como junto con la metadata del documento tenemos una propiedad llamada etag, que en nuestro caso es la siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0200-0000-000000000001&amp;quot;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Este valor es automaticamente modificado en el servidor cuando un documento se actualiza, por lo tanto, si tenemos un problema de concurrencia, lo que pasaría es que&amp;#160; el etag del documento en el servidor no se correspondería con el documento que nosotros enviamos, seria anterior, y por lo tanto podríamos suponer que estamos intentando actualizar algo que ya ha sido cambiado por otro proceso. Ok, ¿como se activa en RavenDB la comparación de los etag en los procesos de modificación?, pues muy sencillo, cualquier sesión, IDocumentSession, tiene un mecanismo para activar el chequeo de concurrencia de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;session.Advanced.UseOptimisticConcurrency = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Con este simple flag, podemos hacer la indicación de comprobación, en realidad lo que hace es que el documento que se envia incluye otra propiedad ETAG, a mayores de la que hay en metadata, para que el servidor sepa que tiene que hacer esta comprobación. Ahora, si ocurriera un problema de concurrencia, recibiríamos la siguiente respuesta del servidor:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;HTTP/1.1 409 Conflict 
  &lt;br /&gt;Cache-Control: private 

  &lt;br /&gt;Content-Type: text/html 

  &lt;br /&gt;Server: Microsoft-IIS/7.5 

  &lt;br /&gt;Raven-Server-Build: 531 

  &lt;br /&gt;X-AspNet-Version: 4.0.30319 

  &lt;br /&gt;X-Powered-By: ASP.NET 

  &lt;br /&gt;Date: Tue, 13 Dec 2011 22:49:33 GMT 

  &lt;br /&gt;Content-Length: 219&lt;/p&gt;

&lt;p&gt;{ 
  &lt;br /&gt;&amp;#160; &amp;quot;Url&amp;quot;: &amp;quot;/bulk_docs&amp;quot;, 

  &lt;br /&gt;&amp;#160; &amp;quot;ActualETag&amp;quot;: &amp;quot;00000000-0000-0300-0000-00000000000b&amp;quot;, 

  &lt;br /&gt;&amp;#160; &amp;quot;ExpectedETag&amp;quot;: &amp;quot;00000000-0000-0300-0000-00000000000a&amp;quot;, 

  &lt;br /&gt;&amp;#160; &amp;quot;Error&amp;quot;: &amp;quot;PUT attempted on document &amp;#39;posts/1&amp;#39; using a non current etag&amp;quot; 

  &lt;br /&gt;}&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Esta respuesta, provoca que se lance una excepción dentro del API de RavenDB, llamada &lt;strong&gt;ConcurrencyException&lt;/strong&gt; que nos dará la información del problema que tenemos, y por lo tanto, refrescar, si así lo queremos nuestra operación.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;Patching….&lt;/h4&gt;

&lt;p&gt;Bien, seguro que muchos estais pensando que, efectivamente, aunque la gestión de la concurrencia nos permite resolver nuestro problema, lo habitual ante la entrada de un post, es la coincidencia de muchos comentarios y por lo tanto tendremos muchos conflictos y demasiado trabajo para que estamos buscando hacer. Una alternativa para hacer esto es utilizar el concepto del verbo &lt;a href="http://tools.ietf.org/html/rfc5789"&gt;PATH&lt;/a&gt; en http. Hacer esto en &lt;a&gt;RavenDB&lt;/a&gt; es realmente sencillo, como veremos a continuación, y nos permitirá, en el caso que estamos, crear nuevos comentarios a un post evitando problemas de concurrencia y mejorando el rendimiento ya que nos evitaremos tener que hacer un load de un documento.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Un patch request es, desde un punto de vista de código, tan sencillo como lo siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;var patchRequest = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PatchRequest()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    Type = PatchCommandType.Add,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    Value = RavenJToken.FromObject(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Comment(){User =&lt;span style="color:#006080;"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt;,Text = &lt;span style="color:#006080;"&gt;&amp;quot;mira señor pregunton...&amp;quot;&lt;/span&gt;}),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    Name = &lt;span style="color:#006080;"&gt;&amp;quot;Comments&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Si nos fijamos en el código anterior, un patch está representado por la clase &lt;strong&gt;PatchRequest&lt;/strong&gt;, en la cual, podemos indicar el tipo de cambio a realizar, PatchCommandType nos ofrece comandos como ( Set, UnSet, Add, Modify,Rename …) la propiedad que modificaremos, en nuestro caso Comments y el cambio. En nuestro caso, el cambio es agregar un nuevo comentario, por lo tanto hacemos una transformación del objeto new &lt;strong&gt;Comment&lt;/strong&gt; a &lt;strong&gt;Json&lt;/strong&gt; por medio de la clase &lt;strong&gt;RavenJToken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Una vez creado el request es suficiente con llamar a &lt;strong&gt;Patch&lt;/strong&gt; definido en &lt;strong&gt;DatabaseCommands&lt;/strong&gt; como podemos er a continuación:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore(){ConnectionStringName =&lt;span style="color:#006080;"&gt;&amp;quot;Raven&amp;quot;&lt;/span&gt;}.Initialize())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(IDocumentSession session = store.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    var patchRequest = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PatchRequest()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Type = PatchCommandType.Add,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Value = RavenJToken.FromObject(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Comment(){User =&lt;span style="color:#006080;"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt;,Text = &lt;span style="color:#006080;"&gt;&amp;quot;mira señor pregunton...&amp;quot;&lt;/span&gt;}),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        Name = &lt;span style="color:#006080;"&gt;&amp;quot;Comments&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    session.Advanced.DatabaseCommands.Patch(&lt;span style="color:#006080;"&gt;&amp;quot;posts/1&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PatchRequest[] { patchRequest });&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Si prestamos un poco de atención vemos como el método Patch nos permite especificar la clave del documento sobre la que vamos a aplicar el cambio, en este caso &lt;strong&gt;posts/1. &lt;/strong&gt;Si ejecutamos esto, y observamos fiddler veríamos algo similar a lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_4B158332.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_0136FB82.png" width="567" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;POST &lt;a href="http://portblackcode/bulk_docs"&gt;http://ravendbserver/bulk_docs&lt;/a&gt; HTTP/1.1 

  &lt;br /&gt;Accept-Encoding: deflate,gzip 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Host: portblackcode 

  &lt;br /&gt;Content-Length: 139 

  &lt;br /&gt;Expect: 100-continue&lt;/p&gt;

&lt;p&gt;[{&amp;quot;Key&amp;quot;:&amp;quot;posts/1&amp;quot;,&amp;quot;Method&amp;quot;:&amp;quot;PATCH&amp;quot;,&amp;quot;Patches&amp;quot;:[{&amp;quot;Type&amp;quot;:&amp;quot;Add&amp;quot;,&amp;quot;Value&amp;quot;:{&amp;quot;User&amp;quot;:&amp;quot;Unai&amp;quot;,&amp;quot;Text&amp;quot;:&amp;quot;mira señor pregunton...&amp;quot;},&amp;quot;Name&amp;quot;:&amp;quot;Comments&amp;quot;}]}]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;y una respuesta de confirmación de cambio:&lt;/p&gt;

&lt;p&gt;HTTP/1.1 200 OK 
  &lt;br /&gt;Cache-Control: private 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Server: Microsoft-IIS/7.5 

  &lt;br /&gt;Raven-Server-Build: 573 

  &lt;br /&gt;X-AspNet-Version: 4.0.30319 

  &lt;br /&gt;Persistent-Auth: true 

  &lt;br /&gt;X-Powered-By: ASP.NET 

  &lt;br /&gt;Date: Thu, 15 Dec 2011 19:40:37 GMT 

  &lt;br /&gt;Content-Length: 271&lt;/p&gt;

&lt;p&gt;[{&amp;quot;Etag&amp;quot;:&amp;quot;00000000-0000-0b00-0000-000000000001&amp;quot;,&amp;quot;Method&amp;quot;:&amp;quot;PATCH&amp;quot;,&amp;quot;Key&amp;quot;:&amp;quot;posts/1&amp;quot;,&amp;quot;Metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Posts&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenUpdate.Post, RavenUpdate&amp;quot;,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-15T18:52:37.8760000Z&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false,&amp;quot;@id&amp;quot;:&amp;quot;posts/1&amp;quot;}}]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;Otras hierbas&lt;/h4&gt;

&lt;p&gt;Este mismo mecanismo nos puede servir también para realización de un cambio en multiples documentos, para ello tenemos el método Batch en vez de Path, desde aquí os dejo a vosotros la tarea de investigación…&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202162" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>RavenDB (IV) La identidad de los documentos</title><link>http://geeks.ms/blogs/unai/archive/2011/12/12/ravendb-iv-la-identidad-de-los-documentos.aspx</link><pubDate>Mon, 12 Dec 2011 11:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202062</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202062</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202062</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/12/ravendb-iv-la-identidad-de-los-documentos.aspx#comments</comments><description>&lt;p&gt;En las anteriores entradas hemos trabajado bastante con los documentos, desde una pequeña &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx"&gt;introducción&lt;/a&gt; hasta elementos más avanzados como el trabajo con la &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/09/ravendb-iii-sobre-la-metadata-y-la-serializaci-243-n-de-los-documentos.aspx"&gt;metadata y la serialización&lt;/a&gt; de los mismos. Sin embargo, hay una cosa sobre la que hemos pasado de puntillas, intencionalmente, pero que trataremos en detalle en esta entrada, y es el tratamiento de la identidad de los documentos. Los documentos, como cualqiuer otro elemento en una colección, tienen que tener un mecanismo que nos permita disitnguirlos de forma unívoca. &lt;strong&gt;&lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;&lt;/strong&gt; hace un gran aporte en este tema, al dejarnos muchas posiblidades para gestionar las identidades &lt;strong&gt;adhoc&lt;/strong&gt; o delegar en &lt;strong&gt;&lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt;,&lt;/strong&gt; y sus distintos mecanismos, la gestión de la misma.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;La propiedad Id&lt;/h2&gt;  &lt;p&gt;La propiedad &lt;strong&gt;Id&lt;/strong&gt;, sin especificar por ahora el tipo de la misma, juega un papel muy importante dentro de &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; ya que por defecto, disponemos de una &lt;a href="https://github.com/ravendb/ravendb/blob/master/Raven.Client.Lightweight/Document/DocumentConvention.cs"&gt;convención&lt;/a&gt; que asocia a esta como la propiedad que marca la identidad de un documento. Por supuesto, estas convenciones pueden modificarse, para ello, solamente tendríamos que especificar los valores de los delegados &lt;strong&gt;FindIdentityPropertyNameFromEntityName&lt;/strong&gt; y &lt;strong&gt;FindIdentityProperty.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; })&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.FindIdentityPropertyNameFromEntityName = e =&amp;gt; &lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.FindIdentityProperty = pInfo =&amp;gt; pInfo.Name == &lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Initialize();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;Con la finalidad de ir mostrando las distintas alternativas que tenemos nos basaremos en una estructura de documento similar a la siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Order&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Id { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime OrderDate { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; Total { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;OrderDetail&amp;gt; Details { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; OrderDetail&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; NumberOfItems { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; ItemPrice { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Fijese en una cuestión importante que suele escapar a aquellas personas que empiezan a trabajar con documentos y es que la entidad &lt;strong&gt;OrderDetail&lt;/strong&gt; NO tiene identidad. Este forma parte del agregado y por lo tanto no puede vivir fuera de el, llevado a documentos podríamos decir que &lt;strong&gt;OrderDetail&lt;/strong&gt; siempre es parte de un documento &lt;strong&gt;Order&lt;/strong&gt; y por lo tanto la identidad no tiene sentido en el. Note que hablamos de &lt;strong&gt;identidad&lt;/strong&gt;, nada impediría tener&amp;#160; algún tipo de secuencia para los detalles de los pedidos.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Sobre una instancia del documento anterior, si procedieramos a su inserción veríamos varios aspectos interesantes que comentaremos a continuación. Supongamos para ello el siguiente código de inserción.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;ol&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; })&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.FindIdentityPropertyNameFromEntityName = e =&amp;gt; &lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.FindIdentityProperty = pInfo =&amp;gt; pInfo.Name == &lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Initialize();&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentSession session = store.OpenSession())&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var newOrder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Order()&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            OrderDate = DateTime.UtcNow,&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            Total = 1000M,&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            Details = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;OrderDetail&amp;gt;()&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            {&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; OrderDetail(){NumberOfItems =1,ItemPrice=20},&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; OrderDetail(){NumberOfItems =1,ItemPrice=20},&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        };&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt; &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        session.Store(newOrder); &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt; &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        session.SaveChanges(); &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt; &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        } &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt; &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
  &lt;/div&gt;

  &lt;blockquote&gt;&lt;/blockquote&gt;
&lt;/ol&gt;

&lt;p&gt;Revisando la secuencia de peticiones con &lt;strong&gt;fiddler&lt;/strong&gt; podemos observar las siguientes trazas, imagen de la derecha, que se corresponden con todo el trabajo necesario para realizar este almacenamiento del documento. La primera de las peticiones, la cual devuelve un 404 es una petición para obtener el valor del &lt;a href="http://codeofrob.com/archive/2010/05/16/ravendb-hilo-what-how-and-why.aspx"&gt;HiLo&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; para la colección de Orders. Esto en realidad ya nos ha dicho mucho acerca de como se va a tratar la identidad. &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; dispone por defecto de una implementación del algorítmo &lt;a href="http://codeofrob.com/archive/2010/05/16/ravendb-hilo-what-how-and-why.aspx"&gt;HiLo&lt;/a&gt; que utiliza por defecto cuando disponemos de una propiedad &lt;strong&gt;Id&lt;/strong&gt;. La tercera entrada de la traza se corresponde a la creción del primer valor de este HiLo, vemos el contenido de la traza en la siguientes lineas:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_70588B7A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_0405750F.png" width="644" height="143" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;PUT &lt;a href="http://XXX/docs/Raven/Hilo/orders"&gt;http:&lt;span class="rem"&gt;//XXX/docs/Raven/Hilo/orders&lt;/span&gt;
If-Match: 00000000-0000-0000-0000-000000000000
Accept-Encoding: deflate,gzip
Content-Type: application/json; charset=utf-8
Host: XXX
Content-Length: 19
Expect: 100-&lt;span class="kwrd"&gt;continue&lt;/span&gt;

{
  &lt;span class="str"&gt;&amp;quot;Max&amp;quot;&lt;/span&gt;: 1024
}&lt;/a&gt; HTTP/1.1&lt;/pre&gt;

&lt;p&gt;En la cuarta traza de fiddler ya podemos ver la inserción del documento con una identidad formada por el nombre de la colección y el Lo calculado, en nuestro caso orders/1:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[{&lt;span class="str"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;orders/1&amp;quot;&lt;/span&gt;,&amp;quot;…&lt;/pre&gt;

&lt;p&gt;Esto está hecho así precisamente para garantizar que las claves sean &lt;em&gt;human readables, &lt;/em&gt;como tenemos un API rest el documento anterior podría ser consultado de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ravendbserver/docs/orders/1"&gt;http://ravendbserver/docs/orders/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Seguro que no se sorprende si le digo que el algoritmo de HiLo puede ser customizado y/o sustituído por otro si así lo deseamos.&amp;#160; La convención &lt;strong&gt;DocumentKeyGenerator&lt;/strong&gt; nos permite realizar esta tarea, como ejemplo demostrativo intentaremos establecer que el mecanismo de generación es el HiLo implementado en RavenDB pero cambiaremos la capacidad para ir de 100 en 100 en vez de 1024 en 1024.&amp;#160; Esto, es tan sencillo como se puede ver a continuación:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; })&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    var hiloAlg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MultiTypeHiLoKeyGenerator(store, capacity: 100);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.DocumentKeyGenerator = (document) =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; hiloAlg.GenerateDocumentKey(store.Conventions, document);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    };&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;         &lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Bien, hasta ahora entonces podríamos resumir que si una entidad tiene una propiedad Id de tipo string entonces &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; se basa en la conbinación del nombre de la colección ( Raven-Entity-Name) y un algoritmo de HiLo para generarnos la identidad de los documentos de una forma sencilla y &lt;em&gt;human readable&lt;/em&gt;. Vamos a ver un caso diferente,¿que pasa si la propiedad en vez de ser de tipo &lt;strong&gt;string&lt;/strong&gt;&amp;#160; es de tipo &lt;strong&gt;int?. &lt;/strong&gt;Nada, no pasa absolutamente nada, todo sigue igual, se sigue utilizando el mismo mecanismo de Hilo y la identidad es igual que para el caso anterior, aunque nosotros vemos en la entidad este valor como un entero sin el nombre de la colección en vez de como un &lt;strong&gt;string.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿ Y si no quiero un HiLo y quiero un auto incremental?¿ Cómo hago entonces?? &lt;/strong&gt;Bueno, en realidad esto es también muy sencillo de implementar en &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; solamente tendríamos que poner nuestra convención DocumentKeyGenerator como sigue:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDocumentStore store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; })&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Conventions.DocumentKeyGenerator = (document) =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var typeTagName = store.Conventions.GetTypeTagName(document.GetType());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var separator = store.Conventions.IdentityPartsSeparator;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;{0}{1}&amp;quot;&lt;/span&gt;, typeTagName, separator);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    store.Initialize();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled2" border="0" alt="Untitled2" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_thumb_5F00_7FCB777C.png" width="644" height="119" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Y si ponemos un Guid? &lt;/strong&gt;En este caso &lt;strong&gt;RavenDB&lt;/strong&gt; nos sigue ayudando y nos ofrece un generador automático para este tipo de propiedades, lógicamente la pega es que ahora este tipo de consultas por rest ya no son tan amigables como teníamos para los casos anteriores.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_1063726B.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled3" border="0" alt="Untitled3" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_thumb_5F00_63DA4284.png" width="644" height="76" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Por supuesto, otra posibilidad que tenemos es&amp;#160; nos especificar ninguna propiedad &lt;strong&gt;Id&lt;/strong&gt;, y delegar por completo en la infraesetructura de &lt;strong&gt;RavenDB&lt;/strong&gt; su generación, por supuesto, esta identidad no será visible en los documentos, por lo menos no directamente tendríamos que usar &lt;strong&gt;session.Advanced.GetDocumentId.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;Las referencias&lt;/h2&gt;

&lt;p&gt;Durante todas las entradas hemos estado hablando acerca de como emparejábamos la definición de los documentos con la de agregados. Pues bien, los documentos, al igual que los agregados, pueden contener referencias a otros documentos. En nuestro caso, para ilustrarlo vamos a modificar la definición de nuestra entidad OrderDetail para agregar una referencia a un documento llamada &lt;strong&gt;Producto, &lt;/strong&gt;para ello, incluiremos una propiedad llamada &lt;strong&gt;ProductId, &lt;/strong&gt;fíjese en la convención por defecto.&lt;/p&gt;



&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; OrderDetail&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ProductId { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; NumberOfItems { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; ItemPrice { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled4" border="0" alt="Untitled4" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled4_5F00_thumb_5F00_4BF35B5E.png" width="644" height="425" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Una vez modificado esta entidad, si hacemos el ejercicio de incluir un documento de tipo &lt;strong&gt;Producto&lt;/strong&gt; y referenciamos su identidad dentro de un nuevo pedido podríamos ver como el&lt;strong&gt; Raven Management Studio&lt;/strong&gt; es capaz de reconocer estas referencias y dejarnos navegar por las mismas. Por no adelantarnos no lo haremos, pero en realidad, esto también es relativamente importante para nuestro proceso de consulta puesto que, nos permitirá hacer un eager loading de aquellas referencias que tengamos en nuestros documentos, de tal forma que nos podamos ahorrar round trips con la base de datos y por lo tanto mejorar el rendimiento de nuestro sistema. Curiósamente el método de carga de referencias se llama Include, igual que en &lt;strong&gt;Entity Framework&lt;/strong&gt; para las propiedades de navegación.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bueno, creo que no nos hemos dejado nada con respecto al tratamiento de las entidades ¿verdad?.&amp;#160; En la siguiente entrada sobre &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;, veremos un poco, solamente un poco de consultas para tratar los temas de actualización, concurrencia optimista y patches…..&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos &lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202062" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>Libro gratuíto y en español de Windows Azure</title><link>http://geeks.ms/blogs/unai/archive/2011/12/09/libro-gratu-237-to-y-en-espa-241-ol-de-windows-azure.aspx</link><pubDate>Fri, 09 Dec 2011 09:35:18 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202060</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202060</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202060</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/09/libro-gratu-237-to-y-en-espa-241-ol-de-windows-azure.aspx#comments</comments><description>&lt;p&gt;Por si a alguno se les ha escapado la noticia permitirme recordaros en mi blog que por fin tenemos el primer libro gratuito y en Castellano sobre Windows Azure y Cloud Clomputing. Aunque tengo el honor de aparecer como autor, por ser fiel a la realidad, os puedo asegurar que mi trabajo, por desgracia, ha sido mínimo y que todo el esfuerzo y los grandes resultados han sido obra de &lt;a href="http://www.geeks.ms/blogs/ilanda"&gt;Ibon Landa&lt;/a&gt;, Microsoft MVP de Windows Azure.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El libro, accesible en formato digita len Scribid lo tenéis disponible en tres entregas que paso a relatar:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://es.scribd.com/doc/72025814/Subete-a-la-nube-de-Microsoft-Parte-1-Introduccion-a-Windows-Azure"&gt;Parte I – Introducción a Windows Azure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://es.scribd.com/doc/72993459/Subete-a-la-nube-de-Microsoft-Parte-2-Almacenamiento-en-Windows-Azure"&gt;Parte II – Sistemas de almacenamiento, SQL Azure y Windows Azure Storage&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://es.scribd.com/doc/74482487/Subete-a-La-Nube-de-Microsoft-Parte-3-Windows-Azure-AppFabric"&gt;Parte III – Windows Azure AppFabric&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Espero que os guste, por supuesto, los comentarios siempre son bienvenidos…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202060" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Azure/default.aspx">Azure</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Libro/default.aspx">Libro</category></item><item><title>RavenDB(III) Sobre la metadata y la serialización de los documentos</title><link>http://geeks.ms/blogs/unai/archive/2011/12/09/ravendb-iii-sobre-la-metadata-y-la-serializaci-243-n-de-los-documentos.aspx</link><pubDate>Fri, 09 Dec 2011 09:06:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202027</guid><dc:creator>Unai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=202027</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=202027</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/09/ravendb-iii-sobre-la-metadata-y-la-serializaci-243-n-de-los-documentos.aspx#comments</comments><description>&lt;p&gt;En esta tercera de las entradas sobre &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt;, si lo deseas puedes consultar las entariores &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/01/ravendb-i-empezamos.aspx"&gt;aquí&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx"&gt;aquí&lt;/a&gt;, intentaremos continuar el trabajo dónde lo dejamos, es decir, profundizando acerca del concepto y el trabajo con lo documentos. Como ya hemos podido ver, &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; utiliza una serie de convenciones para trasladar nuestros tipos .NET ( incluídos dinámicos y anónimos ) a un payload que enviar por &lt;strong&gt;HTTP&lt;/strong&gt;. Este proceso tiene dos partes importantes, la primera es la de obtención y creación de la metadata y la segunda la obtención del contenido de la entidad que será almacenada como un documento en la base de datos. A lo largo de esta entrada veremos como se realizan ambas tareas y sobre todo como podemos cambiar o ampliar su funcionamiento.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;La metadata&lt;/h2&gt;  &lt;p&gt;En la anterior entrega ya vimos como &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; dispone de una serie de convenciones que nos permitían decidir como extrar información de metadata, en concreto, vimos como disponemos de una convención llamada &lt;strong&gt;FindTypeTagName&lt;/strong&gt; gracias a la cual podríamos modificar como se obtenía el valor de &lt;strong&gt;Raven-Entity-Name&lt;/strong&gt;, propiedad de la metadata de un documento por defecto. A mayor de esta propiedad, &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; incluye en la metadata la información del tipo .NET que se ha utilizado para serializar el documento en la propiedad &lt;strong&gt;Raven-Clr-Type, &lt;/strong&gt;el valor de esta propiedad en realidad es meramente informativo, es decir, se podría modificar el tipo ( nombre ,namespace etc ) y cargarse perfectamente después aunque el valor de &lt;strong&gt;Raven-Clr-Type&lt;/strong&gt; ya no sea coincidente. Al igual que con &lt;strong&gt;Raven-Entity-Name&lt;/strong&gt; la forma de obtener el tipo de un documento también se puede modificar facilmente, como para el caso anterior, en nuestro &lt;strong&gt;DocumentStore.Conventions&lt;/strong&gt; tendremos el método &lt;strong&gt;FindClrTypeName&lt;/strong&gt; al cual le podremos asignar el delegado que se ejecutará para obtener este valor. Un ejemplo de implementación podría ser el siguiente:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;documentStore.Conventions.FindClrTypeName = (type) =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; type.FullName;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Por supuesto, ver o cambiar las propiedades actuales de la metadata no es lo único que nos puede interesar. Otra tarea importante es la de poder agregar nuevos elementos a esta metadata, bien para realizar alguna extensión de &lt;strong&gt;RavenDb&lt;/strong&gt;, muchos &lt;strong&gt;bundles&lt;/strong&gt; usan esto, o para poder posteriormente hacer algún índice de consulta que use esta información. Agregar información a la metadata de un documento se puede hacer de diferentes formas, iremos viendo estas en los siguientes puntos:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Metadata de forma explícita&lt;/h3&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Cualquier &lt;em&gt;session &lt;/em&gt;de &lt;strong&gt;RavenDB &lt;/strong&gt;pone a nuestra disposición un método para obtener y manipular la metadata de un documento. En concreto, el método &lt;strong&gt;GetMetadataFor&lt;/strong&gt; que tenemos disponible en las operaciones de una sesión nos permite obtener un &lt;strong&gt;RavenJObject&lt;/strong&gt; con esta información. En el siguiente tip de código podemos ver esto:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var documentStore = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = http:&lt;span style="color:#008000;"&gt;//localhost }.Initialize())&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var session = documentStore.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var customer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            FirstName = &lt;span style="color:#006080;"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            LastName =&lt;span style="color:#006080;"&gt;&amp;quot;Zorrilla&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var metadata = session.Advanced.GetMetadataFor(customer);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#008000;"&gt;//TODO: work with this metadata&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Estos objetos &lt;strong&gt;RavenJObject&lt;/strong&gt; no son más que, en un principio, pares de clave/valor&amp;#160; sobre los que podemos interactuar de una forma sencilla como podemos ver en el siguiente tip de código, en el que incluímos una nueva propiedad de metadata.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_55458A08.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_45C27839.png" width="644" height="252" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var session = documentStore.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    var customer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        FirstName = &lt;span style="color:#006080;"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        LastName =&lt;span style="color:#006080;"&gt;&amp;quot;Zorrilla&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    session.Store(customer);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    var metadata = session.Advanced.GetMetadataFor(customer);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    metadata[&lt;span style="color:#006080;"&gt;&amp;quot;MyCustomMetadataProperty&amp;quot;&lt;/span&gt;] = &lt;span style="color:#006080;"&gt;&amp;quot;the customer metadata property value&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    session.SaveChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Por supuesto, si nos vamos a nuestro &lt;strong&gt;Raven Management Studio&lt;/strong&gt; podremos ver como esta nueva propiedad de metadata forma parte de nuestro documento, tal y como nos muestra la imagen anterior.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Metadata con Listeners&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RavenDB&lt;/strong&gt; nos proporciona un mecanismo de &lt;em&gt;listerners &lt;/em&gt;similar, en concepto no tanto en propósito, al que tenemos en &lt;strong&gt;NHibernate&lt;/strong&gt; con los &lt;em&gt;event listeners.&amp;#160; &lt;/em&gt;Para registrar un listener con &lt;strong&gt;&lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;&lt;/strong&gt; solamente tenemos que hacer uso del método &lt;strong&gt;RegisterListener&lt;/strong&gt; que nos proporciona la clase &lt;strong&gt;DocumentStore,&lt;/strong&gt; ojo que es explícitamente la implementación y no la interface &lt;strong&gt;IDocumentStore&lt;/strong&gt;. Me imagino que esto es intencional para promocionar el registro y la inicialización en un punto, aunque lógicamente esto habría que preguntarselo al creador. Un listener, no es más que cualquier clase que implemente el contrato &lt;strong&gt;IDocumentConversionListener&lt;/strong&gt;. En las siguientes lineas se puede ver la inicialización de un &lt;strong&gt;DocumentStore&lt;/strong&gt; con un Listener y el esqueleto del mismo.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var documentStore = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://portblackcode&amp;quot;&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                            .RegisterListener(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MyDocumentConversionListener())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                            .Initialize())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var session = documentStore.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MyDocumentConversionListener&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    :IDocumentConversionListener&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DocumentToEntity(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; entity, Raven.Json.Linq.RavenJObject document, Raven.Json.Linq.RavenJObject metadata)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; EntityToDocument(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; entity, Raven.Json.Linq.RavenJObject document, Raven.Json.Linq.RavenJObject metadata)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Visto esto, si quisiéramos hacer lo mismo que en el caso anterior sería tan simple como lo siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MyDocumentConversionListener&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    :IDocumentConversionListener&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DocumentToEntity(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; entity, RavenJObject document, RavenJObject metadata)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; EntityToDocument(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; entity, RavenJObject document, RavenJObject metadata)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        metadata[&lt;span style="color:#006080;"&gt;&amp;quot;MyCustomMetadataProperty&amp;quot;&lt;/span&gt;] = &lt;span style="color:#006080;"&gt;&amp;quot;the customer metadata property value&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;La serialización&lt;/h2&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bien, llegados hasta aquí ya sabemos como se obtiene la metadata de cada uno de los documentos, a mayores, también sabemos incluso los mecanismos que tenemos para modificar esa metadata si queremos agregar información personalizada y, también, cuales son las convenciones que tenemos por defecto. Ahora llega la hora de entender cuales son los miembros de un tipo que se utilizan para formar los documentos de las entidades y, si es posible, como cambiar este comportamiento.&amp;#160; Para hacer este ejercicio vamos a empezar por jugar con una clase que contenga los elementos más habituales en una entidad, propiedades, fields, propiedades de solo lectura, etc etc… la entidad en cuestión es la siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SeralizationEntity&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DefaultProperty { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _readOnlyProperty =&lt;span style="color:#006080;"&gt;&amp;quot;readonly property&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ReadOnlyProperty&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        get&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _readOnlyProperty;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _PublicField;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _PrivateField =&lt;span style="color:#006080;"&gt;&amp;quot;private field&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _Values = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; Values&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        get&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _Values.AsEnumerable();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Si hacemos el ejercicio de guardar una instancia de esta clase en realidad el documento contendría la siguiente información:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span style="font-size:small;"&gt;[&lt;span class="str"&gt;&amp;quot;Document&amp;quot;&lt;/span&gt;:{&lt;span class="str"&gt;&amp;quot;_PublicField&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;DefaultProperty&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;default property&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;ReadOnlyProperty&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;readonly property&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;Values&amp;quot;&lt;/span&gt;:[]}]&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Es decir, &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; por defecto solamente incluye los elementos públicos de nuestras entidades, sean propiedades o fields y sean de solo lectura o no las propiedades. Aunque esto está bien, la verdad, es que en muchísimos escenarios no será correcto, necesario o incluso válido. En muchas ocasiones no queremos que algunas propiedades se serializen, como por ejemplo Values, o también que los fields privados sean parte del documento. Por suerte, &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; nos ofrece bastantes facilidades para lograr introducir todas nuestras necesidades en cuanto al diseño de los documentos.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;La primera parte, la de ocultar alguna propiedad o, incluso, hacer que el nombre de la propiedad en el documento no se corresponda con la propiedad de la entidad puede hacerse fácilmente utilizando una serie de atributos, al igual que, por poner un simil, podemos hacer en &lt;a href="http://www.mongodb.org"&gt;MongoDB&lt;/a&gt; con &lt;strong&gt;BsonDocument&lt;/strong&gt;, &lt;strong&gt;BsonElement&lt;/strong&gt; etc. En realidad, estos atributos son los definidos por &lt;a href="http://json.codeplex.com/"&gt;JSON.NET&lt;/a&gt;, dependencia de &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt; para el tema de serialización/deserializacion JSON/.NET. En el siguiente tip de código podemos ver como ignorar la propiedad Values y modificar el nombre de nuestro field publico.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SeralizationEntity&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DefaultProperty { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _readOnlyProperty =&lt;span style="color:#006080;"&gt;&amp;quot;readonly property&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ReadOnlyProperty&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        get&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _readOnlyProperty;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    [JsonProperty(&lt;span style="color:#006080;"&gt;&amp;quot;Field&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _PublicField;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _PrivateField =&lt;span style="color:#006080;"&gt;&amp;quot;private field&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _Values = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    [JsonIgnore()]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; Values&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        get&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _Values.AsEnumerable();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Con lo que el documento quedaría de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[&lt;span class="str"&gt;&amp;quot;Document&amp;quot;&lt;/span&gt;:{&lt;span class="str"&gt;&amp;quot;Field&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;DefaultProperty&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;default property&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;ReadOnlyProperty&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;readonly property&amp;quot;&lt;/span&gt;}]&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Bien, la primera parte ya la hemos tratado, ahora quizás queda en principio la más complicada y es, decirle a RavenDB como tiene que resolver estos contratos de entidad,&amp;#160; usar fields privados etc etc…. Por suerto, como siempre hasta ahora, tenemos un punto de trabajo. En &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;, la resolución de las entidades, que elementos formarán parte de los documentos se hace por medio de un contrato llamado &lt;strong&gt;IContractResolver.&amp;#160; &lt;/strong&gt;La implementación por defecto que &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; nos ofrece es &lt;strong&gt;DefaultRavenContractResolver&lt;/strong&gt; y la misma puede agregarse facilmente desde nuestro &lt;strong&gt;DocumentStore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;documentStore.Conventions.JsonContractResolver = &lt;span class="kwrd"&gt;new&lt;/span&gt; DefaultRavenContractResolver(shareCache: &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Con el fin de lograr nuestro objetivo vamos a hacer una nueva implementación de IContractResolver y, para ahorrarnos tiempo y trabajo la vamos a hacer partiendo de la implementación por defecto,&lt;strong&gt;DefaultContractResolver&lt;/strong&gt;, ojo no es &lt;strong&gt;DefaultRavenContractResolver&lt;/strong&gt;.. Asi, si queremos serializar miembros privados solamente tendríamos que hacer lo siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ContractResolverWithPrivateFieldsSupport&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    :DefaultContractResolver&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ContractResolverWithPrivateFieldsSupport()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        : &lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;(shareCache: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;&amp;#160; &lt;/div&gt;

&lt;p&gt;Bueno, creo que por ahora es bastante, hay que dejar para las siguientes entradas… ¿Preguntas?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos
  &lt;br /&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202027" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/NOSQL/default.aspx">NOSQL</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>RavenDB (II)- Los documentos</title><link>http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx</link><pubDate>Mon, 05 Dec 2011 10:25:40 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201996</guid><dc:creator>Unai</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201996</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201996</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/05/ravendb-ii-los-documentos.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;Tal y como ya dijimos en la anterior entrada, &lt;a&gt;RavenDB&lt;/a&gt; es una base de &lt;a href="http://ayende.com/blog/4459/that-no-sql-thing-document-databases"&gt;datos documental&lt;/a&gt;,&amp;#160; y esto, está llevado a su extremo. Una de las primeras cosas que me llamaron la atención de &lt;a&gt;RavenDB&lt;/a&gt; es que en realidad, físicamente, en &lt;a&gt;RavenDB&lt;/a&gt;, no hay otra cosa que documentos, es decir, al contrario que en otros sistemas del mismo tipo como &lt;a&gt;MongoDB&lt;/a&gt;, no existen, físicamente por lo menos, el concepto de colecciones, más adelante veremos como en realidad el concepto de colección es &lt;strong&gt;lógico&lt;/strong&gt; es decir, documentos que comparten un atributo de metadata.&lt;/p&gt;    &lt;p&gt;Una&amp;#160; de las características principales que también nombramos es que Raven es &lt;strong&gt;RESTfull&lt;/strong&gt; y por lo tanto podremos mediante la identificación de recursos y verbos &lt;strong&gt;HTTP&lt;/strong&gt; acceder a los documentos almacenados. Según vayamos avanzando en nuestras entradas iremos viendo los verbos y el contenido de cada tipo de petición. Por ahora, con el fin de ir mostrando distintos ejemplos iremos a nuestro &lt;strong&gt;Raven Management Studio&lt;/strong&gt; y utilizaremos la opción de crear un juego de documentos de ejemplo, tal y como podemos ver en la siguientes figura:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/sampledata_5F00_5CE60531.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="sampledata" border="0" alt="sampledata" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/sampledata_5F00_thumb_5F00_03D0530D.png" width="644" height="433" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Una vez creados los documentos de ejemplo, podremos observar como RavenDB pone a nuestra disposición un conjunto de recursos principales para almacenar los documentos, estos recursos, o &lt;strong&gt;database layout&lt;/strong&gt; como se conoce en la documentación, son los siguientes:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://[servidor-raven]/docs"&gt;http://[servidor-raven]/docs&lt;/a&gt; : Nos permite acceder a todos los documentos de la base de datos por defecto. Si, raven permite tener múltiples bases de datos, pero, sino hacemos el ejercicio de crearlas siempre tenemos la &lt;strong&gt;“Default Database”&lt;/strong&gt; como punto de trabajo. Si haces esta petición utilizando &lt;strong&gt;IE&lt;/strong&gt; recuerda que este no entiende el &lt;strong&gt;application/json&lt;/strong&gt; y por lo tanto seguramente te pida descargar un archivo (para evitarlo se puede tocar una ent&lt;a href="http://stackoverflow.com/questions/2483771/how-can-i-convince-ie-to-simply-display-application-json-rather-than-offer-to-do"&gt;rada de registro&lt;/a&gt;). Si miramos el resultado de esta petición con &lt;strong&gt;Fiddler&lt;/strong&gt; veríamos algo como lo siguiente:&lt;/p&gt;    &lt;p&gt;HTTP/1.1 200 OK      &lt;br /&gt;Cache-Control: private       &lt;br /&gt;Content-Type: application/json; charset=utf-8       &lt;br /&gt;Server: Microsoft-IIS/7.5       &lt;br /&gt;Raven-Server-Build: 531       &lt;br /&gt;X-AspNet-Version: 4.0.30319       &lt;br /&gt;X-Powered-By: ASP.NET       &lt;br /&gt;Date: Thu, 01 Dec 2011 18:47:28 GMT       &lt;br /&gt;Content-Length: 12447&lt;/p&gt;    &lt;p&gt;[{&amp;quot;AlbumArtUrl&amp;quot;:&amp;quot;/Content/Images/placeholder.gif&amp;quot;,&amp;quot;Artist&amp;quot;:{&amp;quot;Id&amp;quot;:&amp;quot;artists/113&amp;quot;,&amp;quot;Name&amp;quot;:&amp;quot;Os Paralamas Do Sucesso&amp;quot;},&amp;quot;Genre&amp;quot;:{&amp;quot;Id&amp;quot;:&amp;quot;genres/7&amp;quot;,&amp;quot;Name&amp;quot;:&amp;quot;Latin&amp;quot;},&amp;quot;Price&amp;quot;:8.99,&amp;quot;Title&amp;quot;:&amp;quot;Arquivo II&amp;quot;,&amp;quot;CountSold&amp;quot;:1,&amp;quot;@metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Albums&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;MvcMusicStore.Models.Album, Mvc Music Store&amp;quot;,&amp;quot;Content-Type&amp;quot;:&amp;quot;application/json; charset=utf-8&amp;quot;,&amp;quot;Last-Modified&amp;quot;:&amp;quot;2011-12-01T18:38:30.4410000+01:00&amp;quot;,&amp;quot;@id&amp;quot;:&amp;quot;albums/626&amp;quot;,&amp;quot;@etag&amp;quot;:&amp;quot;00000000-0000-0100-0000-000000000100&amp;quot;,&amp;quot;Non-Authoritive-Information&amp;quot;:false}},{....}]&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Fíjese la estructura para el primer documento devuelto, se ha omitido toda la salida por simplicidad, por el servidor, la cual está formada por una serie de propiedades principales, el&lt;strong&gt; Id&lt;/strong&gt;, la &lt;strong&gt;metadata&lt;/strong&gt;, &lt;strong&gt;detalles&lt;/strong&gt; del documento, ultima modificación, un &lt;strong&gt;etag&lt;/strong&gt; etc&amp;#160; y la propia información del mismo, el &lt;strong&gt;cuerpo o los datos&lt;/strong&gt;. Más grafícamente, el documento en cuestión seria tal y como se puede ver en las siguientes imagenes extraidas de &lt;strong&gt;RavenDB&lt;/strong&gt;&amp;#160;&lt;strong&gt;Management Studio&lt;/strong&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_7A17BF09.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="2" border="0" alt="2" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_thumb_5F00_466F52AB.png" width="631" height="484" /&gt;&lt;/a&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/3_5F00_64012DAA.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="3" border="0" alt="3" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/3_5F00_thumb_5F00_5B9D5853.png" width="644" height="466" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si se fija en la imagen de la derecha, dentro de la metadata del documento, tenemos una propiedad llamada &lt;strong&gt;Raven-Entity-Name.&amp;#160; &lt;/strong&gt;Es esta propiedad la que nos permite &lt;em&gt;indicar &lt;/em&gt;que un documento se categoriza en una determinada &lt;strong&gt;colección&lt;/strong&gt;, en nuestro caso &lt;strong&gt;Albums&lt;/strong&gt;, recuerde que unos párrafos atrás deciamos que físicamente no existe el concepto de colección, aquí tiene la respuesta de cómo hace el Management Studio para categorizarnos esta información.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://[servidor-raven]/indexes:"&gt;http://[servidor-raven]/indexes:&lt;/a&gt; En este recurso se alamacenarán los documentos referidos a los indices, estáticos o dinámicos, que tengamos en &lt;a&gt;RavenDb&lt;/a&gt;. Por ahora no vamos a hablar sobre esto, intentaremoms ir paso a paso y lo tocaremos en su profundidad cuando hablemos sobre consultas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://[servidor-raven]/static"&gt;http://[servidor-raven]/static&lt;/a&gt; : Recurso dedicado a los &lt;strong&gt;attachements&lt;/strong&gt;, al igual que los índices lo veremos en cuanto toque.&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/image_5F00_thumb_5F00_1_5F00_660E06A6.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb_1" border="0" alt="image_thumb_1" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/image_5F00_thumb_5F00_1_5F00_thumb_5F00_7ACFD959.png" width="348" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;¿Como se diseña un documento?&lt;/h2&gt;  &lt;p&gt;Si es la primera vez que usted trabaja con una base de datos documental seguramente empezará pagando el peaje del mundo relacional, una tendencia en la que todos hemos caido la primera vez que nos enfrentamos a esta otra forma de trabajar. Generalmente, el primer error que cometemos es la tendencia a crear documentos como filas de una tabla, es decir elementos planos de datos. Poco a poco, nos damos cuenta que esos documentos pueden contener otros documentos, de hecho deberían.&amp;#160; Una buena forma de pensar en estos documentos es igualando los limites del mismo al concepto que tenemos en &lt;strong&gt;&lt;a href="http://domaindrivendesign.org/"&gt;DDD&lt;/a&gt;&lt;/strong&gt; para definir los &lt;strong&gt;agregados, Aggreagte Root&lt;/strong&gt;, de un modelo de dominio:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font face="Courier New"&gt;“Definition: A cluster of associated objects that are treated as a unit for the purpose of data changes. External references are restricted to one member of the Aggregate, designated as the root. A set of consistency rules applies within the Aggregate&amp;#39;s boundaries.”&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;De hecho, hay alguna característica importante de &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; que hacen que este patrón, &lt;strong&gt;Aggregate&lt;/strong&gt;, sea mucho más sencillo de implementar, mucho más que utilizando ORM’s como &lt;strong&gt;EF&lt;/strong&gt; o &lt;strong&gt;NH&lt;/strong&gt;. Hablaremos un poco más adelante sobre esto.&lt;/p&gt;  &lt;p&gt;Por supuesto, un documento puede referenciar a otros documentos, de igual forma que &lt;strong&gt;&lt;a href="http://domaindrivendesign.org/"&gt;Eric Evans&lt;/a&gt;&lt;/strong&gt; en la anotación sobre Agregados comenta:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font face="Courier New"&gt;“Choose one Entity to be the root of each Aggregate, and control all access to the objects inside the boundary through the root. Allow external objects to hold references to root only”&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Cuando veamos el trabajo en la parte cliente nos pararemos, y veremos con detalle, estos puntos que acabamos de comentar, como mantener los invariantes de nuestros agregados y, como se realizan las referencias entre documento y como las mismas son manejadas en &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Vale… pero empezamos ya a trabajar!!&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Seguro que llegados hasta aquí ya todos tenemos ganas de ponernos con lo nuestro, que es .NET, por lo tanto, empezaremos a ver como que son los &lt;em&gt;documenetos &lt;/em&gt;en el mundo .NET y como podemos trabajar con ellos. Lógicamente utilizaremos el API cliente y por lo tanto algunos elementos sobre los que no hemos hablado, aunque mencionaremos su propósito, no se preocupe si no se explican en detalle porque en futuras entradas seguro que se tratan de la forma debida. Por ahora, trabajaremos, por simplificar, con una aplicación de consola a la que le agregaremos las referencias de &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; de cliente, recuerde que en los directorios de instalación teníamos una carpeta llamada &lt;strong&gt;Client, &lt;/strong&gt;si trabaja en .NET 3.5 lógicamente debe de usar la carpeta Client3.5.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ahora que ya tenemos un proyecto con las referencias correspondientes vamos a empezar a crear un ejemplo sencillo. Para &lt;strong&gt;&lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;&lt;/strong&gt;, un documento no es más que una clase .NET o un tipo dinámico cualquiera, por ejemplo, los siguientes elementos son documentos correctos para &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_567ACF0A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="2" border="0" alt="2" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/2_5F00_thumb_5F00_0DE0E039.png" width="1024" height="72" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/1_5F00_32FE2AA5.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="1" border="0" alt="1" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/1_5F00_thumb_5F00_2690077C.png" width="640" height="259" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Para empezar a investigar que es lo que se extrae de estos documentos, vamos a escribir la siguientes lineas de código, las cuales, nos permitirán realizar un guardado en la base de datos de estos documentos. Si tiene experiencia con &lt;a href="http://nhforge.org/"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ef"&gt;EF&lt;/a&gt; seguramente le resulte bastante similar este código al de cualquier guardado con NH/EF. Permitame recordarle que por ahora no nos pararemos demasiado en el código, lo haremos más adelante, permítame ir centrándonos primero en los documentos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var store = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DocumentStore() { Url = &lt;span style="color:#006080;"&gt;&amp;quot;http://localhost&amp;quot;&lt;/span&gt; }.Initialize())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var session = store.OpenSession())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        var order = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Order()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            OrderDate = DateTime.Now,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            Address = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ShippingAddress()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                City =&lt;span style="color:#006080;"&gt;&amp;quot;the city&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                ZipCode =&lt;span style="color:#006080;"&gt;&amp;quot;the zip code&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;                AddressLine1 =&lt;span style="color:#006080;"&gt;&amp;quot;the address line&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        session.Store(order);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;        session.SaveChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Si revisáramos con una traza de fiddler el contenido de la petición anterior veríamos algo similar a lo siguiente &lt;strong&gt;&lt;em&gt;(en realidad también hay otra serie de operaciones referidas al calculo de la idéntidad de este documento, que serán exáminadas en futuras entradas)&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;POST &lt;a href="http://ravendbserver/bulk_docs"&gt;http://ravendbserver/bulk_docs&lt;/a&gt; HTTP/1.1 

  &lt;br /&gt;Accept-Encoding: deflate,gzip 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Host: portblackcode 

  &lt;br /&gt;Content-Length: 270 

  &lt;br /&gt;Expect: 100-continue&lt;/p&gt;

&lt;p&gt;[{&amp;quot;Key&amp;quot;:&amp;quot;orders/2049&amp;quot;,&amp;quot;Method&amp;quot;:&amp;quot;PUT&amp;quot;,&amp;quot;Document&amp;quot;:{&amp;quot;OrderDate&amp;quot;:&amp;quot;2011-12-05T10:55:03.7964347+01:00&amp;quot;,&amp;quot;Address&amp;quot;:{&amp;quot;City&amp;quot;:&amp;quot;the city&amp;quot;,&amp;quot;ZipCode&amp;quot;:&amp;quot;the zip code&amp;quot;,&amp;quot;AddressLine1&amp;quot;:&amp;quot;the address line&amp;quot;}},&amp;quot;Metadata&amp;quot;:{&amp;quot;Raven-Entity-Name&amp;quot;:&amp;quot;Orders&amp;quot;,&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;RavenI.Order, RavenI&amp;quot;}}]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;De esto pueden estraerse algunas conclusiones o elementos que deberemos de examinar en más detalle.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Las operaciones de inserción de documentos se hacen sobre un RequestReponder que trabaja en la URI &lt;a href="http://ravendbserver/bulk_docs"&gt;http://ravendbserver/bulk_docs&lt;/a&gt; con el verbo POST. &lt;/li&gt;

  &lt;li&gt;La información de metadata se extrae de la información del tipo que estamos incluyendo, así por ejemplo el nombre de la propiedad &lt;strong&gt;Raven-Entity-Name&lt;/strong&gt; que nos permite calificar a nuestra colección es una pluralización de la entidad. Esta pluralización está marcada por el tipo&lt;strong&gt; Raven.Client.Util.Inflector, &lt;/strong&gt;aunque como todo el RavenDB, podemos modificarla escribiendo nuestra propia convención de pluralización y asignándola como podemos ver a continuación: &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;store.Conventions.FindTypeTagName = (type) =&amp;gt;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;//this is trivial and not for production implementation&lt;/span&gt;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; type.Name + &lt;span style="color:#006080;"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;};&lt;/pre&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Al documentose le ha asignado una clave de forma automática&amp;#160; “orders/2049” que tendremos que investigar como y que mecanismo se ha utilizado para generarla. Por lo tanto, para consultar este documento podría hacer lo siguiente &lt;a href="http://ravendbserver/docs/orders/2049"&gt;http://ravendbserver/docs/orders/2049&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Si ahora, en vez de utilizar order, utilizamos un tipo anónimo ( igual con lo dinámicos) como el que vimos en las imagenes anteriores tendríamos una payload hacia el servidor como el siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;POST &lt;a href="http://ravendbserver/bulk_docs"&gt;http://ravendbserver/bulk_docs&lt;/a&gt; HTTP/1.1 

  &lt;br /&gt;Accept-Encoding: deflate,gzip 

  &lt;br /&gt;Content-Type: application/json; charset=utf-8 

  &lt;br /&gt;Host: portblackcode 

  &lt;br /&gt;Content-Length: 239 

  &lt;br /&gt;Expect: 100-continue&lt;/p&gt;

&lt;p&gt;[{&amp;quot;Key&amp;quot;:null,&amp;quot;Method&amp;quot;:&amp;quot;PUT&amp;quot;,&amp;quot;Document&amp;quot;:{&amp;quot;OrderDate&amp;quot;:&amp;quot;2011-12-05T11:17:02.5348622+01:00&amp;quot;,&amp;quot;Address&amp;quot;:&amp;quot;the shipping address&amp;quot;},&amp;quot;Metadata&amp;quot;:{&amp;quot;Raven-Clr-Type&amp;quot;:&amp;quot;&amp;lt;&amp;gt;f__AnonymousType0`2[[System.DateTime, mscorlib][System.String, mscorlib]], RavenI&amp;quot;}}]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Y de esta información podemos extraer las siguientes conclusiones:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Los documentos representados como un tipo anónimo no son categorizados en ninguna colección. &lt;/li&gt;

  &lt;li&gt;Por defecto su clave es null y por lo tanto se delega en el servidor la creación de una, &lt;a href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt; utiliza un &lt;strong&gt;Guid&lt;/strong&gt; para representar la clave de este documento, así por ejemplo la consulta del mismo se podría hacer de la siguiente forma &lt;a href="http://ravendbserver/docs/69851d86-58bf-4915-a6c8-2c9b5ae991f7"&gt;http://ravendbserver/docs/69851d86-58bf-4915-a6c8-2c9b5ae991f7&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bueno, hasta aquí llegamos con la segunda entrada, en la siguiente, veremos como hace RavenDB para decidir que elementos de una entidad son utilizados como parte de la información de un documento, propiedades publicas o no, fields publicos o no etc etc etc.. a mayores también hablaremos acerca de la identidad y del trabajo con la metadata.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201996" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/NOSQL/default.aspx">NOSQL</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>RavenDB (I)–Empezamos….</title><link>http://geeks.ms/blogs/unai/archive/2011/12/01/ravendb-i-empezamos.aspx</link><pubDate>Thu, 01 Dec 2011 00:10:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201948</guid><dc:creator>Unai</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201948</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201948</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/12/01/ravendb-i-empezamos.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/logo_2D00_ravendb_5F00_1BBF4DCB.png"&gt;&lt;img height="222" width="640" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/logo_2D00_ravendb_5F00_thumb_5F00_3D0ECD9A.png" align="right" alt="logo-ravendb" border="0" title="logo-ravendb" style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los que ten&amp;eacute;is la suerte o desgracia de sufrir&amp;nbsp; mi blog, sabr&amp;eacute;is lo que me gusta &lt;a href="http://www.mongodb.org"&gt;Mongo DB&lt;/a&gt;, de hecho, repasando las entradas de mi blog me he dado cuenta de que&amp;nbsp; ya son &lt;a href="http://geeks.ms/blogs/unai/archive/tags/Mongo/default.aspx"&gt;unas cuantas&lt;/a&gt;, sumado esto a los diferentes eventos en los que he tenido la suerte de hablar de esta base documental y, a los proyectos en producci&amp;oacute;n en los que he participado haciendo uso de esta base de datos, os pod&amp;eacute;is dar una buna&amp;nbsp;idea del aprecio&amp;nbsp; y cari&amp;ntilde;o que le tengo a esta &lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;No obstante, hace ya bastante tiempo que ten&amp;iacute;a ganas de experimentar, de forma seria,&amp;nbsp;&lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;RavenDB&lt;/a&gt;, cada vez que pod&amp;iacute;a, restando a las&amp;nbsp;&amp;iacute;nfimas horas no ocupadas de las que dispongo,&amp;nbsp;me pasaba por el sitio de esta base de datos y revisaba la documentaci&amp;oacute;n, buscando como avanzaba el proyecto y las multiples y diferentes caracter&amp;iacute;sticas que se iban a&amp;ntilde;adiendo poco a poco, as&amp;iacute; como el&amp;nbsp; impacto que el producto estaba teniendo en la comunidad. No voy a negar que en un principio siempre ten&amp;iacute;a la tentaci&amp;oacute;n de buscar comparaciones, ser&amp;iacute;a mentir, puesto que en cierto grado es normal, cuando vas probar un producto, y lo que no es un producto :-),&amp;nbsp;siempre lo comparas con lo que ya conoces. &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.mongodb.org"&gt;MongoDB&lt;/a&gt; hace esto as&amp;iacute;, entonces, &amp;iquest;como lo hace &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/www.ravendb.net"&gt;Raven DB&lt;/a&gt;? &amp;hellip; eran de las primeras cosas que ven&amp;iacute;an a la cabeza. Pero, poco a poco, eso se ha ido perdiendo,diluyendo m&amp;aacute;s bien....esto es debido a que,&amp;nbsp;b&amp;aacute;sicamente, &lt;strong&gt;creo que sinceramente&lt;/strong&gt; &lt;strong&gt;no hay comparaci&amp;oacute;n posible, por lo menos no en el mundo .NET y menos&amp;nbsp;a&amp;uacute;n en ciertos escenarios,&lt;/strong&gt; por lo tanto, en esta entrada y en las siguientes de la serie&lt;strong&gt; no vais a encontrar comparaciones&lt;/strong&gt;, &lt;strong&gt;si&lt;/strong&gt; acaso &lt;strong&gt;ligeras referencias de t&amp;eacute;rminos&lt;/strong&gt; o elementos que hacen a &lt;strong&gt;&lt;a href="http://www.ravendb.net/"&gt;RavenDB&lt;/a&gt; &lt;/strong&gt;diferente.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;L&amp;oacute;gicamente lo primero es lo primero, en esta entrada&amp;nbsp;empezaremos por los conceptos m&amp;aacute;s b&amp;aacute;sicos, sitio del producto, descarga y puesta en marcha etc.., seg&amp;uacute;n avancemos en las diferentes entradas iremos &amp;nbsp;ampliando la informaci&amp;oacute;n y nos meteremos en harina, que es d&amp;oacute;nde nos gusta estar:&lt;/p&gt;
&lt;h2&gt;RavenDB .NET&lt;/h2&gt;
&lt;p&gt;El sitio principal del proyecto es &lt;a href="http://www.ravendb.net"&gt;www.ravendb.net&lt;/a&gt; , por ahora, es un sitio a&amp;uacute;n no&amp;nbsp;demasiado bien cuidado, pero est&amp;aacute;n preparando&lt;strong&gt; un nuevo portal&lt;/strong&gt; mucho mejor organizado, con mejor presencia y sobre todo mucho m&amp;aacute;s contenido que el actual, este nuevo portal se puede consultar en &lt;a href="http://beta.ravendb.net"&gt;http://beta.ravendb.net&lt;/a&gt; . Nada m&amp;aacute;s entrar al sitio podemos ver las principales caracter&amp;iacute;sticas de &lt;a href="http://www.ravendb.net/"&gt;RavenDB&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base de datos documental&lt;/strong&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/image_5F00_4_5F00_13F3472A.png"&gt;&lt;img height="275" width="640" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/image_5F00_4_5F00_thumb_5F00_70B325F9.png" align="right" alt="image_4" border="0" title="image_4" style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transaccional&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RestFull&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalable&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema Free&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Level caching&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensible&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para serle sincero, desde el principio fue&amp;nbsp;una sorpresa ver como en&amp;nbsp;este sitio, y m&amp;aacute;s a&amp;uacute;n en el beta, hay una gran cantidad de &lt;a href="http://www.ravendb.net/documentation"&gt;documentaci&amp;oacute;n&lt;/a&gt;, &lt;a href="http://www.ravendb.net/tutorials"&gt;tutoriales&lt;/a&gt;, &lt;a href="http://www.ravendb.net/FAQ"&gt;FAQ&lt;/a&gt;,etc etc que podemos consultar,y, si a&amp;uacute;n tenemos preguntas no respondidas podriamos ir al&amp;nbsp; propio &lt;a href="http://groups.google.com/group/ravendb"&gt;grupo&lt;/a&gt; de soporte para &lt;a href="http://www.ravendb.net/"&gt;RavenDb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Despliegue&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_788A7CC1.png"&gt;&lt;img height="480" width="366" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_04101434.png" align="left" alt="Untitled" border="0" title="Untitled" style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez que hemos descargado una build de &lt;a href="http://www.ravendb.net/"&gt;RavenDB&lt;/a&gt;, pod&amp;eacute;is acceder a las fuentes y &amp;uacute;ltimos binarios &lt;a href="http://www.ravendb.net/download"&gt;aqu&amp;iacute;&lt;/a&gt;, simplemente tenemos que descomprimir el contenido de la descarga y nos encontraremos con una estructura de directorios similar a la que pod&amp;eacute;is ver en la imagen presente a la izquierda. En cada uno de los directorios podemos encontrar diferentes elementos, la informaci&amp;oacute;n completa de su contenido la teneis disponible en el correspondiente fichero readme.txt. Por ahora solamente nos vamos a fijar en las carpetas &lt;strong&gt;Server&lt;/strong&gt; y &lt;strong&gt;Web&lt;/strong&gt; que son las que nos permitir&amp;aacute;n desplegar un servidor de&lt;strong&gt; Raven DB,&lt;/strong&gt; de varias&amp;nbsp;formas diferentes.&lt;/p&gt;
&lt;p&gt;Para el primer ejemplo de despliegue&amp;nbsp;nos iremos a la carpeta &lt;strong&gt;Server&lt;/strong&gt;, en esta carpeta encontraremos, a mayores del conjunto de librer&amp;iacute;as necesarias, un ejecutable llamado &lt;strong&gt;Raven.Server.exe&lt;/strong&gt; . Este ejecutable representa un servidor de Raven, el cual podr&amp;iacute;a ser levantado simplemente con la ejecuci&amp;oacute;n de la siguiente linea de comandos:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raven.Server.exe &amp;ndash;debug --browser&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Es recomandable ver la ayuda de la linea de comandos para ver las diferentes opciones que tenemos disponibles. En este sentido me ha recordado mucho a &lt;a target="_blank" href="http://www.mongodb.org"&gt;MongoDB&lt;/a&gt;, el proceso es similar a levantar un &lt;strong&gt;mongod&lt;/strong&gt; en &lt;a href="http://www.mongodb.org"&gt;MongoDB&lt;/a&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;y,&amp;nbsp;adem&amp;aacute;s,&amp;nbsp;comparte tambien con esta bd la opci&amp;oacute;n &lt;strong&gt;--install&lt;/strong&gt; para poner &lt;strong&gt;&lt;a href="http://www.ravendb.net/"&gt;Raven DB&lt;/a&gt;&lt;/strong&gt; como un &lt;strong&gt;Servicio Windows&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El fichero de configuraci&amp;oacute;n del proceso &lt;strong&gt;Raven.Server.exe.config&lt;/strong&gt; contiene algunos par&amp;aacute;metros de configuraci&amp;oacute;n importantes, aunque no todos como veremos durante las siguientes entradas. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&lt;span class="str"&gt;&amp;quot;Raven/Port&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&lt;span class="str"&gt;&amp;quot;Raven/DataDir&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;~\Data&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key=&lt;span class="str"&gt;&amp;quot;Raven/AnonymousAccess&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;Get&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Como se habr&amp;aacute; dado cuenta con estos tres par&amp;aacute;metros podemos configurar el puerto en el que escuchar&amp;aacute; el &lt;strong&gt;HttpListener&lt;/strong&gt; asociado a &lt;a href="http://www.ravendb.net/"&gt;RavenDB&lt;/a&gt;, la carpeta que se utilizar&amp;aacute; para almacenar toda la informaci&amp;oacute;n referida al servidor de &lt;strong&gt;Raven&lt;/strong&gt; ( datos, indices etc&amp;hellip;) y los permisos que por defecto tendr&amp;aacute; un usuario an&amp;oacute;nimo, estando este por defecto a Get.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si no queremos hacer el despliegue de Raven como un &lt;strong&gt;Servicio Windows&lt;/strong&gt;, podemos optar por un despliegue de un sitio en &lt;strong&gt;Internet Information Server&lt;/strong&gt;. Para ello tenemos el directorio &lt;strong&gt;Web&lt;/strong&gt;, el cual, si se fija lo &amp;uacute;nico que contiene es, adem&amp;aacute;s del directorio bin con las dependencias necesarias, el archivo de configuraci&amp;oacute;n del sitio con un handler para especificar el manejo de los request, en concreo la factoria de los RequestResponders, algo sobre lo que hablaremos cuando veamos la parte de extensibilidad, simple &amp;iquest;verdad?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;    &amp;lt;system.webServer&amp;gt;
        &amp;lt;handlers&amp;gt;
            &amp;lt;add name=&lt;span class="str"&gt;&amp;quot;All&amp;quot;&lt;/span&gt; path=&lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt; verb=&lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;
                        type=&lt;span class="str"&gt;&amp;quot;Raven.Web.ForwardToRavenRespondersFactory, Raven.Web&amp;quot;&lt;/span&gt;/&amp;gt;
        &amp;lt;/handlers&amp;gt;
    &amp;lt;/system.webServer&amp;gt;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;h2&gt;Raven Db Mana&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/studio_5F00_5519EA2A.png"&gt;&lt;img height="300" width="333" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/studio_5F00_thumb_5F00_3C0DF418.png" align="left" alt="studio" border="0" title="studio" style="background-image:none;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;padding-top:0px;border-width:0px;" /&gt;&lt;/a&gt;gement Studio&lt;/h2&gt;
&lt;p&gt;Tanto si levantamos el servidor como una consola, un servicio windows o un sitio de IIS en todos tendremos disponible una &lt;strong&gt;aplicaci&amp;oacute;n Silverlight, &lt;/strong&gt;si, has o&amp;iacute;do bien, llamada &lt;strong&gt;Raven Db Management Studio&lt;/strong&gt; que, como su propio nombre indica, es una peque&amp;ntilde;a herramienta de administraci&amp;oacute;n de las diferentes bases de datos que tengamos en el servidor.&lt;/p&gt;
&lt;p&gt;Por ahora no vamos a entrar en m&amp;aacute;s consideraciones, a&amp;uacute;n hay muchas cosas que explicar, seg&amp;uacute;n avancemos en las diferentes entradas iremos viendo esta herramienta y el porque de algunas cosas. Por ahora, con tener el servidor levantado y preparado para funcionar es suficiente.&lt;/p&gt;
&lt;p&gt;Un detalle importante, que a mi no me ha resultado demasiado sencillo encontrar en la documentaci&amp;oacute;n es que el sitio &lt;strong&gt;de IIS tiene que tener habilitada la integraci&amp;oacute;n con Windows&lt;/strong&gt;. Recurede que en la settings de configuraci&amp;oacute;n se pod&amp;iacute;a restringir el acceso an&amp;oacute;nimo por lo tanto,&amp;nbsp; sino queremos trabajar en modo an&amp;oacute;nimo tenemos que asegurarnos que cumplimos esto.&lt;/p&gt;
&lt;p&gt;Bueno, por ahora lo dejaremos aqu&amp;iacute;, seguiremos en las siguientes entradas, que no se retrasar&amp;aacute;n mucho, lo prometo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos&lt;/p&gt;
&lt;p&gt;Unai&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201948" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/NOSQL/default.aspx">NOSQL</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven/default.aspx">Raven</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Raven+DB/default.aspx">Raven DB</category></item><item><title>EF Migrations, EF 4.3 y que nos deparará el futuro</title><link>http://geeks.ms/blogs/unai/archive/2011/11/30/ef-migrations-ef-4-3-y-que-nos-deparar-225-el-futuro.aspx</link><pubDate>Wed, 30 Nov 2011 17:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201940</guid><dc:creator>Unai</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201940</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201940</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/11/30/ef-migrations-ef-4-3-y-que-nos-deparar-225-el-futuro.aspx#comments</comments><description>&lt;p&gt;Hoy mismo se ha hecho p&amp;uacute;blica &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx"&gt;la primera beta del paquete de &amp;ldquo;migraciones&amp;rdquo;&lt;/a&gt; que el equipo de Entity Framework ha estado preparando durante ya hace alg&amp;uacute;n tiempo, de hecho, en este mismo blog ya hemos publicado unas cuantras entradas,&lt;a href="http://geeks.ms/blogs/unai/archive/2011/09/12/ef-vnext-migrations-i.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/unai/archive/2011/09/15/ef-vnext-migrations-ii.aspx"&gt;aqu&amp;iacute;&lt;/a&gt;, referidas a su funcionamiento. Lo m&amp;aacute;s destacable de este anuncio, a mayores de los cambios y novedades en el paquete, comentaremos sobre esto m&amp;aacute;s adelante, es el hecho de que incorporar&amp;aacute;n Migrations como parte de&lt;strong&gt; EF 4.3&lt;/strong&gt;, es decir, que ya no existir&amp;aacute; el paquete &lt;strong&gt;EntityFramework.Migrations&lt;/strong&gt; como tal. Desde mi punto de vista, esto es sin duda una gran idea, puesto que el trabajo con migraciones no es &amp;ldquo;algo opcional&amp;rdquo; en un proyecto real.&amp;nbsp; Hablando con un miembro del equipo sobre cuales ser&amp;iacute;an las implicaciones directas de este paso se puso sobre la mesa la posibilidad de que alguna funcionalidad estuviera duplicada entre el code base de EF Code First y el paquete de migraciones. Un ejemplo de esto, podr&amp;iacute;a ser por ejemplo los inicializadores de EF, &lt;strong&gt;IDatabaseInitializer&amp;lt;T&amp;gt; &lt;/strong&gt;cuya funcionalidad podr&amp;iacute;a solaparse con el &lt;strong&gt;Seed&lt;/strong&gt; que podemos hacer en nuestro &lt;strong&gt;DbMigrationsConfiguration, &lt;/strong&gt;aunque en mi opini&amp;oacute;n ambos podrian tener prop&amp;oacute;sitos diferentes. Lo m&amp;aacute;s interesante de este movimiento, es lo que se puede leer por detr&amp;aacute;s, es decir, como poco a poco el equipo de EF est&amp;aacute; haciendo movimientos para apartarse de la dependencia de .NET Framework, dependencia que seguro que afecta enormemente a su ciclo de vida, a su capacidad de entrega y a la resoluci&amp;oacute;n de problema de una forma m&amp;aacute;s agil. Seguro, que no dentro de mucho, nos dar&amp;aacute;n alguna sorpresa en cuanto al ciclo de vida y modelo de desarrollo con respecto a &lt;strong&gt;EF&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bueno, al chollo:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Realmente, el funcionamiento de esta beta es bastantet similar, de hecho ya advierte de que hay unas peque&amp;ntilde;as features y sobre todo refactoring. Lo primero en lo que nos podemos fijar con respecto a las versiones anteriores es que ahora la clase &lt;strong&gt;DbMigrationContext&lt;/strong&gt; de las versiones anteriores se sustituye por &lt;strong&gt;DbMigrationsConfiguration&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Configuration : DbMigrationsConfiguration&amp;lt;BlogUnitOfWork&amp;gt;
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; Configuration()
        {
            AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
        
            &lt;span class="rem"&gt;// Seed data: &lt;/span&gt;
            &lt;span class="rem"&gt;//   Override the Seed method in this class to add seed data.&lt;/span&gt;
            &lt;span class="rem"&gt;//    - The Seed method will be called after migrating to the latest version.&lt;/span&gt;
            &lt;span class="rem"&gt;//    - You can use the DbContext.AddOrUpdate() helper extension method to avoid creating&lt;/span&gt;
            &lt;span class="rem"&gt;//      duplicate seed data. E.g.&lt;/span&gt;
            &lt;span class="rem"&gt;//&lt;/span&gt;
            &lt;span class="rem"&gt;//          myContext.AddOrUpdate(c =&amp;gt; c.FullName,&lt;/span&gt;
            &lt;span class="rem"&gt;//              new Customer { FullName = &amp;quot;Andrew Peters&amp;quot;, CustomerNumber = 123 },&lt;/span&gt;
            &lt;span class="rem"&gt;//              new Customer { FullName = &amp;quot;Brice Lambson&amp;quot;, CustomerNumber = 456 },&lt;/span&gt;
            &lt;span class="rem"&gt;//              new Customer { FullName = &amp;quot;Rowan Miller&amp;quot;, CustomerNumber = 789 }&lt;/span&gt;
            &lt;span class="rem"&gt;//          );&lt;/span&gt;
            &lt;span class="rem"&gt;//&lt;/span&gt;
        }
    }&lt;/pre&gt;
&lt;p&gt;Por supuesto, aunque ahora no se muestren, esta clase nos sigue ofreciendo la posibilidad de establecer las generadores de&lt;strong&gt; c&amp;oacute;digo SQL y codigo C#&lt;/strong&gt; de las migraciones que hagamos, adem&amp;aacute;s de otra serie de flags, como por ejemplo &lt;strong&gt;AutomaticMigrationDataLossAlowed&lt;/strong&gt;, que nos permitir&amp;aacute;n modificar alg&amp;uacute;n comportamiento adicional. Otro elemento a mayores, es ver como han creado un nuevo m&amp;eacute;todo extensor, &lt;strong&gt;AddOrUpdate&lt;/strong&gt; que nos simplificar&amp;aacute; el &lt;strong&gt;Seed&lt;/strong&gt; de los datos.

&lt;/p&gt;
&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; InitalSteep : DbMigration
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
        {
            CreateTable(
                &lt;span class="str"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;,
                c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                    {
                        Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                        Title = c.String(),
                        Description = c.String(),
                        AuthorId = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;),
                    })
                .PrimaryKey(t =&amp;gt; t.Id)
                .ForeignKey(&lt;span class="str"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;, t =&amp;gt; t.AuthorId, cascadeDelete: &lt;span class="kwrd"&gt;true&lt;/span&gt;)
                .Index(t =&amp;gt; t.AuthorId);
            
            CreateTable(
                &lt;span class="str"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;,
                c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                    {
                        Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                        FirstName = c.String(),
                        LastName = c.String(),
                    })
                .PrimaryKey(t =&amp;gt; t.Id);
            
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Down()
        {
            DropIndex(&lt;span class="str"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;AuthorId&amp;quot;&lt;/span&gt; });
            DropForeignKey(&lt;span class="str"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;AuthorId&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;);
            DropTable(&lt;span class="str"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;);
            DropTable(&lt;span class="str"&gt;&amp;quot;Blogs&amp;quot;&lt;/span&gt;);
        }
    }&lt;/pre&gt;
&lt;p&gt;

Al igual que hac&amp;iacute;amos antes, tambi&amp;eacute;n podemos hacer customizaciones en las distintas migraciones, as&amp;iacute;, por ejemplo,&amp;nbsp;si nos interesar&amp;aacute; poder un&amp;nbsp;&amp;iacute;ndice sobre la columna FirstName de nuestra tabla authors podr&amp;iacute;amos hacer alog como lo siguiente:&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;           CreateTable(
                &lt;span class="str"&gt;&amp;quot;Authors&amp;quot;&lt;/span&gt;,
                c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                    {
                        Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                        FirstName = c.String(),
                        LastName = c.String(),
                    })
                .PrimaryKey(t =&amp;gt; t.Id)
                &lt;strong&gt;.Index(a=&amp;gt;a.FirstName,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;A mayores de los m&amp;eacute;todos de customizaci&amp;oacute;n de&amp;nbsp;DbMigration, base para todas las definiciones de migraci&amp;oacute;n, esta nos ofrece un m&amp;eacute;todo llamado &lt;strong&gt;Sql&lt;/strong&gt; que nos servir&amp;aacute; para ejecutar, en el caso de necesitarlo, un comando SQL, como por ejemplo un&amp;nbsp; UPDATE para poner un valor por defecto a una de las nuevas columnas, etc.&lt;/p&gt;
&lt;p&gt;Bueno, aqu&amp;iacute; se queda esto por ahora&amp;hellip; Para los que os guste el tema y a&amp;uacute;n no hayais podido profundizar os recomienod los recomiendo las guias paso a paso del equipo de Entity Framework que est&amp;aacute;n &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-no-magic-walkthrough.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; y &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-with-magic-walkthrough-automatic-migrations.aspx"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nos despedimos hasta la pr&amp;oacute;xima d&amp;oacute;nde empezaremos una serie sobre &lt;a target="_blank" href="http://www.ravendb.net"&gt;RavenDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un saludo&lt;/p&gt;
&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201940" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.0/default.aspx">EF 4.0</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.1/default.aspx">EF 4.1</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+Migrations/default.aspx">EF Migrations</category></item><item><title>HOT:Inserciones masivas en Sql Sersver vs Mongo DB ( III)</title><link>http://geeks.ms/blogs/unai/archive/2011/11/20/hot-inserciones-masivas-en-sql-sersver-vs-mongo-db-iii.aspx</link><pubDate>Sun, 20 Nov 2011 13:26:51 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201781</guid><dc:creator>Unai</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201781</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201781</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/11/20/hot-inserciones-masivas-en-sql-sersver-vs-mongo-db-iii.aspx#comments</comments><description>&lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;DESCARGO DE RESPONSABILIDAD&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Antes de empezar la entrada me gustaría dejar claro que esto es un &lt;strong&gt;pasatiempos&lt;/strong&gt;, una forma de &lt;strong&gt;dilucidar quien pagaba las cenas&lt;/strong&gt; durante el tiempo que nos toco a los dos estar perdidos en una ciudad que no es la nuestra con nuestros respectivos trabajos. La idea de esta serie de blogs no es ver si queremos más a Papa o a Mama, a Sql Server o a una NoSQL. Los resultados que se obtengan no tienen porque hacer pensar que una es mejor que la otra ( sobre todo cuando son compatibles) y por supuesto el performance no es una(la única) razón de selección de una NoSQL como Mongo, escalabilidad, schema-free, base, last-update ni de un sistema transacciónl como Sql Serve. Si esto te queda claro y quieres jugar con nosotros, y por supuesto, aprender como lo hemos hecho nosotros, a forzar situaciones como la presente tanto de Sql Server como de Mongo entonces sigue leyendo…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h1&gt;&lt;em&gt;&lt;/em&gt;&lt;/h1&gt;  &lt;h1&gt;&amp;#160;&lt;/h1&gt;  &lt;h1&gt;La bala de la recamara….&lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Me voy a permitir adelantarme al post de Pablo Doval con sus conclusiones puesto que, este finde esta muy, pero que muy ocupado haciendo que el Sql Server de otro ande más rapido. Como había dicho, me preocupaba mucho el tema de mis bloqueos, puesto que o cambiaba de tercio o no tendría mucho margen de mejora. Pensando y pensando (algún comodín también) me puse a ver que podría hacer y recorde que con las &lt;a href="http://www.mongodb.org/display/DOCS/Capped+Collections"&gt;Capped Collections de Mongo&lt;/a&gt; DB podría ganar algo, puesto que a la hora de crearlas podría especificar el espacio a ocupar y por lo tanto hacer un pequeño prefetch de la base de datos. En realidad, una colección capped no es más que una colección con un tamaño máximo dado y un número de documentos máximo. La definición exacta de las &lt;strong&gt;capped collections&lt;/strong&gt; la tenéis en la siguiente frase:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Capped collections are fixed sized collections that have a very high performance auto-FIFO age-out feature (age out is based on insertion order). They are a bit like the &amp;quot;RRD&amp;quot; concept if you are familiar with thatç&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Bueno, “high performance auto-FIFO”….&lt;/em&gt; esto es lo que andaba buscando…. Vamos, además, a unirlo con un poco de paralelismo para ver si nos sorprendemos con los resultados que obtengamos. Para ello, lo primero que haremos será levantar nuestro servidor de &lt;strong&gt;mongodb&lt;/strong&gt; con prácticamente las mismas opciones que en la entrada anterior, he incluido alguna más pero no han tenido demasiado efecto…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;mongod&amp;#160; -- dbpath c:\mongo\data&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- nohttpinterface&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- noauth&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- nojournal&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- quiet&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- verbose&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- diaglog&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- logpath log.txt&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- install&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ahora, modificaremos nuestro código para que se cree la colección a utilizar como una capped collection, fíjese que en esta creación hemos puesto ya tamaños máximos de documentos y espacio. Además también hemos realizado otra optimización al poner &lt;strong&gt;SetAutoIndex&lt;/strong&gt; a false eliminando así la creación del índice&amp;#160; sobre &lt;strong&gt;_id &lt;/strong&gt;por defecto.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; MongoCollection SetupAndPrepareCollection()
        {
            var dbSettings = &lt;span class="kwrd"&gt;new&lt;/span&gt; MongoServerSettings()
            {
                ConnectionMode = ConnectionMode.Direct,
                SafeMode  = SafeMode.False,
                Server = &lt;span class="kwrd"&gt;new&lt;/span&gt; MongoServerAddress(&lt;span class="str"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;)
            };

            &lt;span class="rem"&gt;//create server and get database&lt;/span&gt;
            var server = MongoServer.Create(dbSettings);
            var db = server.GetDatabase(&lt;span class="str"&gt;&amp;quot;speedUp&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;//set collection options&lt;/span&gt;
            var collectionOptionsBuilder = &lt;span class="kwrd"&gt;new&lt;/span&gt; CollectionOptionsBuilder();
            collectionOptionsBuilder.SetAutoIndexId(&lt;span class="kwrd"&gt;false&lt;/span&gt;);
            collectionOptionsBuilder.SetCapped(&lt;span class="kwrd"&gt;true&lt;/span&gt;);
            collectionOptionsBuilder.SetMaxSize(40000000);
            collectionOptionsBuilder.SetMaxDocuments(590000);

            &lt;span class="kwrd"&gt;string&lt;/span&gt; collectionName = &lt;span class="str"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (db.CollectionExists(collectionName))
                db.DropCollection(collectionName);

            db.CreateCollection(collectionName, collectionOptionsBuilder);
            db.SetProfilingLevel(ProfilingLevel.None);

            &lt;span class="kwrd"&gt;return&lt;/span&gt; db.GetCollection(collectionName);
        }&lt;/pre&gt;

&lt;p&gt;El paralelismo es sencillo, basta con usar el magnífico API de TPL y agregar unas cuantas Task como se ve a continuación. Como seguramente muchos os preguntéis, he probado diferente número de hilos, y la verdad es que no he obtenido mejor, lo cual, me hace indicar que el problema no es de contención en el procesador, ni de uso, es ya un tema en MongoDB.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            var watch = Stopwatch.StartNew();

            var task = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaskFactory().StartNew(()=&amp;gt;
            {
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Task(() =&amp;gt; Work(), TaskCreationOptions.AttachedToParent).Start();
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Task(() =&amp;gt; Work(), TaskCreationOptions.AttachedToParent).Start();
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Task(() =&amp;gt; Work(), TaskCreationOptions.AttachedToParent).Start();
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Task(() =&amp;gt; Work(), TaskCreationOptions.AttachedToParent).Start();
                
            });
            task.ContinueWith(t=&amp;gt;
            {
                watch.Stop();
                Console.WriteLine(watch.Elapsed);
            },TaskContinuationOptions.OnlyOnRanToCompletion);&lt;/pre&gt;

&lt;p&gt;El código de Work es el siguiente&amp;#160; :&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Work()
        {
            &lt;span class="rem"&gt;//create batch and iterations specs&lt;/span&gt;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; maxDocuments = 125000;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; batchSize = 100;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; iterations = maxDocuments / batchSize;

            &lt;span class="kwrd"&gt;int&lt;/span&gt; index = 0;
            var batch = &lt;span class="kwrd"&gt;new&lt;/span&gt; BsonDocument[batchSize];

            &lt;span class="rem"&gt;//create insert options&lt;/span&gt;
            var insertOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; MongoInsertOptions(collection);
            insertOptions.CheckElementNames = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            insertOptions.SafeMode = SafeMode.False;
            insertOptions.Flags = InsertFlags.ContinueOnError;

            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; iterations; i++)
            {

                &lt;span class="kwrd"&gt;while&lt;/span&gt; (index &amp;lt; batchSize)
                {
                    batch[index] = &lt;span class="kwrd"&gt;new&lt;/span&gt; BsonDocument()
                    {
                        {&lt;span class="str"&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;,Guid.NewGuid().ToByteArray()},
                        {&lt;span class="str"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;XXXXXXXXXXXXXXXXXXXX&amp;quot;&lt;/span&gt;}
                    };
                    ++index;
                }

                index = 0;
                collection.InsertBatch(batch, insertOptions);
            }
        }&lt;/pre&gt;

&lt;p&gt;Venga, vamos a hacer la prueba…. [redoble de tambores…….] el resultado es …. &lt;strong&gt;&lt;font size="3"&gt;1,6&lt;/font&gt; segundos, &lt;/strong&gt;gracias a las &lt;strong&gt;capped collections &lt;/strong&gt;y al &lt;strong&gt;prefetch&lt;/strong&gt; del tamaño&amp;#160; y número de documentos he aumentado el rendimiento &lt;strong&gt;enormemente, de &lt;font size="3"&gt;3,5 a 1,6&lt;/font&gt; segundos en insertar 500K documentos…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;&lt;strong&gt;…….Sigo preocupado…..&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;Las malas lenguas me han dicho que pablo bajará ese tiempo…. y ya, lo único que se me ocurre es montar un &lt;strong&gt;sharding y no tengo muy claro que eso NO sea hacer TRAMPAS….&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nos leemos,&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201781" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Performance/default.aspx">Performance</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Mongo/default.aspx">Mongo</category><category domain="http://geeks.ms/blogs/unai/archive/tags/MongoDb/default.aspx">MongoDb</category><category domain="http://geeks.ms/blogs/unai/archive/tags/NOSQL/default.aspx">NOSQL</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Klingon+Programmers/default.aspx">Klingon Programmers</category></item><item><title>HOT:Inserciones Masivas en MongoDB vs Sql Server (II)</title><link>http://geeks.ms/blogs/unai/archive/2011/11/18/hot-inserciones-masivas-en-mongodb-vs-sql-server-ii.aspx</link><pubDate>Fri, 18 Nov 2011 10:36:13 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201750</guid><dc:creator>Unai</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201750</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201750</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/11/18/hot-inserciones-masivas-en-mongodb-vs-sql-server-ii.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;DESCARGO DE RESPONSABILIDAD&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Antes de empezar la entrada me gustaría dejar claro que esto es un &lt;strong&gt;pasatiempos&lt;/strong&gt;, una forma de &lt;strong&gt;dilucidar quien pagaba las cenas&lt;/strong&gt; durante el tiempo que nos toco a los dos estar perdidos en una ciudad que no es la nuestra con nuestros respectivos trabajos. La idea de esta serie de blogs no es ver si queremos más a Papa o a Mama, a Sql Server o a una NoSQL. Los resultados que se obtengan no tienen porque hacer pensar que una es mejor que la otra ( sobre todo cuando son compatibles) y por supuesto el performance no es una(la única) razón de selección de una NoSQL como Mongo, escalabilidad, schema-free, base, last-update ni de un sistema transacciónl como Sql Serve. Si esto te queda claro y quieres jugar con nosotros, y por supuesto, aprender como lo hemos hecho nosotros, a forzar situaciones como la presente tanto de Sql Server como de Mongo entonces sigue leyendo…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Bueno, seguro que muchos habéis leido la entrarada de mi compañero de batallas y amigo &lt;a href="http://geeks.ms/blogs/palvarez/archive/2011/11/17/hot-inserciones-masivas-en-mongodb-vs-sql-server.aspx"&gt;Pablo Doval&lt;/a&gt; sobre un pequeño pique “paga cenas” a ver quien insertaba de una forma más rápida 500 K de registros. En la &lt;a href="http://geeks.ms/blogs/palvarez/archive/2011/11/17/hot-inserciones-masivas-en-mongodb-vs-sql-server.aspx"&gt;primera entrada&lt;/a&gt; de mi contrincante hemos podido ver como su primer esfuerzo ha resultado en&lt;strong&gt; 4 segundos escasos, &lt;/strong&gt;quiero imaginarme que con escasos no se refiere a 0,9 por lo que entenderé que mi primer reto es superar simplemente 4 segundos. Bien, 4 segundos, no está nada mal, sobre todo porque teniendo en cuenta lo que ha utilizado me temo que tiene un gran arco de mejora ( aunque no seré yo quien se lo diga, más que nada porque de Sql Server el ya sabe mejor que yo …). Vamos a ver que podemos hacer con nuestro jueguete, por supuesto, no empezaremos haciendo ninguna optimización, lo más simple, así tendremos una ligera idea de por dónde andamos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;El primer intento&lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Tal y como acabo de comentar el primer intento será lo mas simple posible, insertaremos en MongoDB 500K documentos. Si, documentos, para los que no lo sepais, &lt;strong&gt;MongoDb&lt;/strong&gt; es una base de datos documental, entendiendo como esto a algo similar a lo que podéis ver en la imagen de la derecha. Las normas de nuestra pequeña apuestas decían que teníamos que in&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_4E5DC753.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_6DDCF15B.png" width="644" height="335" /&gt;&lt;/a&gt;sertar 500K documentos ( el filas ) con un tipo de datos Guid y una cadena con 20 caracteres. Por lo tanto, abriremos un proyecto de &lt;strong&gt;Visual Studio 2010&lt;/strong&gt; y vamos a empezar a jugar. Lo primero será agregar las librerías necesarias para trabajar con &lt;a href="http://www.mongodb.org"&gt;Mongo DB&lt;/a&gt;, para ello podemis ir hacia la sección &lt;a href="http://www.mongodb.org/display/DOCS/Drivers"&gt;de drivers&lt;/a&gt; de Mongo DB y descargar los de C# o mejor aún utilizar el paquete de NuGet que esta gente tiene disponible, concretamente el paquete se llama &lt;a href="http://nuget.org/List/Packages/mongocsharpdriver"&gt;mongocsharpdriver&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Levantando el servidor&lt;/h5&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lógicamente, antes de conectarnos tenemos que levantar un servidor de &lt;strong&gt;MongoDB&lt;/strong&gt;, para ello, por ahora, no utilizaremos ninguna &lt;em&gt;setting&lt;/em&gt; especial, de hecho, lo levantaremos como una consola y no como un servicio de Windows ( si, ya se que eso puede tener un impacto, veremos si es cierto… ). Es decir, levantaremos el servidor con las simples instrucciones siguientes:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;mongod.exe –dbpath c:\mongo\data [c:\mongo\data es el path para alojar la &lt;em&gt;base de datos&lt;/em&gt;]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;Ahora, es hora del código, con las siguientes lineas voy a acceder a una colección llamada &lt;em&gt;tests&lt;/em&gt; en una base de datos llamada &lt;em&gt;apuesta &lt;/em&gt;dónde posteriormente intentaré introducir los 500 K registros.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; MongoCollection GetCollection()
        {
            var server = MongoServer.Create(&lt;span class="str"&gt;&amp;quot;mongodb://localhost&amp;quot;&lt;/span&gt;);
            var database = server.GetDatabase(&lt;span class="str"&gt;&amp;quot;apuesta&amp;quot;&lt;/span&gt;);

            &lt;span class="kwrd"&gt;return&lt;/span&gt; database.GetCollection(&lt;span class="str"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;);
        }&lt;/pre&gt;

&lt;p&gt;Ahora, solamente me queda darle a mi bucle y esperar los resultados para ver desde dónde vamos a empezar a jugar, espero sinceramente que no sea muy alto porque 4 segundos es un muy buen número. Mientras me preparaba para hacerlo me puse a pensar si lo haríamos de forma tipada o no. Es decir, el &lt;strong&gt;API de MongoDB&lt;/strong&gt; me permite definir los distintos documentos mediante clases que posteriormente el serializará al formato de trabajo. Aunque no quería hacer ninguna optimización temprana me parecía que esto sería un poco estúpido y por lo tanto trabajaría directamente con documentos no tipados, es decir, con &lt;strong&gt;BsonDocuments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            var collection = GetCollection();

            var watch = Stopwatch.StartNew();

            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 500000; i++)
            {
                collection.Insert(&lt;span class="kwrd"&gt;new&lt;/span&gt; BsonDocument()
                {
                    {&lt;span class="str"&gt;&amp;quot;Guid&amp;quot;&lt;/span&gt;,Guid.NewGuid()},
                    {&lt;span class="str"&gt;&amp;quot;Data&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;XXXXXXXXXXXXXXXXXXX&amp;quot;&lt;/span&gt;}
                });
            }

            watch.Stop();
            Console.WriteLine(watch.Elapsed);
            Console.ReadLine();
            
        }&lt;/pre&gt;


&lt;p&gt;……………………. ( redoble de tambores)… 18,74 segundazos…… bufff, más de 4 veces que el mejor número de Pablo. Lo primero que hago es comprobar que no he comentido un error, que todos los datos estan en la base de datos, por lo que me conecto a mongo y hago una revisión del numero de documentos y del formato que contienen, en la siguiente imagen podéis ver los pasos que he seguido desde la &lt;strong&gt;shell&lt;/strong&gt; de &lt;strong&gt;MongoDb&lt;/strong&gt; para hacerlo.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_2AB1732E.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled2" border="0" alt="Untitled2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_thumb_5F00_2B79B34B.png" width="1028" height="589" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;….. unos ínfimos cambios y otro disparo….&lt;/h1&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bien, estamos lejos, pero la verdad, teniendo en cuenta como lo hicimos, tampoco es que me asustará demasiado, hay dos cosas que podemos arreglar rápidamente, la primera es que cuando levantamos el servidor de Mongo como consola no desabilitamos el stdout ni el nivel de verbosidad, por lo tanto, segurmanente eso esté influyendo bastante.&amp;#160; La segunda es que mongo dispone de un sistema de batching por el cual podemos insertar un conjunto de documentos de forma simultanea.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Empezaremos los cambios por levantar una instancia del servidor de mongo como un servicio de windows con la siguiente parametrización:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;mongod –-install [lo instalamos como un servicio]&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --diaglog 0 [deshabilitamos los diagnostics log]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --quiet [reducimos la verbosidad de standard out&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --nojournal [ eliminamos la feature introducida en 1.8 para asegurar recuperación de datos no insertados en caso de crash]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font face="Consolas"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ahora, le toca la parte al código,&amp;#160; vamos a hacer el batching, para ello, modificamos nuestro código de inserción por el siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Batching()
        {
            var collection = GetCollection();

            &lt;span class="kwrd"&gt;int&lt;/span&gt; max = 500000;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; batch = 1000;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; iterations = max / batch;

            &lt;span class="kwrd"&gt;int&lt;/span&gt; count = 0;
            var watch = Stopwatch.StartNew();
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; iterations; i++)
            {
                var data = &lt;span class="kwrd"&gt;new&lt;/span&gt; BsonDocument[batch];
                &lt;span class="kwrd"&gt;while&lt;/span&gt; (count &amp;lt; batch)
                {
                    
                    data[count] = &lt;span class="kwrd"&gt;new&lt;/span&gt; BsonDocument()
                    {
                        {&lt;span class="str"&gt;&amp;quot;g&amp;quot;&lt;/span&gt;,Guid.NewGuid()},
                        {&lt;span class="str"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;XXXXXXXXXXXXXXXXXXX&amp;quot;&lt;/span&gt;}
                    };

                    ++count;
                }

                collection.InsertBatch(data);
                count = 0;
            }

            watch.Stop();
            Console.WriteLine(watch.Elapsed);
            Console.ReadLine();

        }&lt;/pre&gt;

&lt;p&gt;Ahora tomamos el tiempo y es ….&lt;strong&gt;5.005&lt;/strong&gt; segundos…. nada mal, si señor, estamos cerca ya de nuestro amigo…. pero aún falta ganar un segundo por algun lado. La primera parece pensar en jugar con los tamaños del batch pero después de algunas pruebas la mejora no es substancial como para ponerla, en mi máquina mi mejor respuesta es con un tamaño de 600&amp;#160; y a partir de 1500 los tiempos se hacen muy grandes. Por lo que parece que se mueve mejor con batch pequeños de estos documentos que muy grandes…&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;…tercer disparo y Pablo paga la cena (hoy)&lt;/h1&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hay que ganar un segundo, ese es el reto ahora. Como lo hacemos?? bueno, a ver, vamos a revisar las opciones de inserción para ver si podemos&lt;strong&gt; tunear algun parámetro. &lt;/strong&gt;Si, nos fijamos en las sobrecargas de &lt;strong&gt;InsertBatch&lt;/strong&gt;, veremos que podemos incluir unas opciones de insercion por medio de la clase &lt;strong&gt;MongoInsertOptions. &lt;/strong&gt;Si revisais esta clase, veréis&amp;#160; que hay tres parámetros importantes, &lt;strong&gt;CheckElementNames&lt;/strong&gt;,&lt;strong&gt;SafeMode&lt;/strong&gt; y &lt;strong&gt;Flags&lt;/strong&gt;. El primero, nos permite decidir si queremos comprobar los nombres de los documentos, claves, collecciones etc antes de procesar un insert, el segundo permite especificarnos el modo de seguridad por defecto y el tercero el comportamiento en caso de fallo. Vamos a tunear estas opciones con nuestros batch y a ver que resultado tenemos….&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;            var insertOptions = &lt;span class="kwrd"&gt;new&lt;/span&gt; MongoInsertOptions(collection);
            insertOptions.CheckElementNames = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            insertOptions.SafeMode = SafeMode.False;
            insertOptions.Flags = InsertFlags.ContinueOnError;&lt;/pre&gt;
  &lt;/blockquote&gt;

&lt;p&gt;…youhuuuuu &lt;strong&gt;3.50 segundos&lt;/strong&gt;… Pabloooooooooooooooooooooooooooooooo pagas la cena!!!!!!!!!!!!!!!!!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;…aún así, sigo preocupado&lt;/h1&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Si, sigo preocupado porque Pablo tiene buenas posibilidades de mejora y yo, viendo las estadisticas de mi Mongo, siguiente imagen, veo que si quiero bajar de esos tiempos tengo que cambiar algún concepto y usar algo más de artillería… pero no se si me llegará…. en fin, ya veremos si supera los 3.50 y por cuanto lo supera…&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_0BBAB3B6.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled3" border="0" alt="Untitled3" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_thumb_5F00_027E7875.png" width="1028" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Nos veremos en la siguiente…&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201750" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/Mundo+Geek/default.aspx">Mundo Geek</category><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Performance/default.aspx">Performance</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Mongo/default.aspx">Mongo</category><category domain="http://geeks.ms/blogs/unai/archive/tags/MongoDb/default.aspx">MongoDb</category></item><item><title>DDD-CQRS post event</title><link>http://geeks.ms/blogs/unai/archive/2011/11/11/ddd-cqrs-post-event.aspx</link><pubDate>Fri, 11 Nov 2011 10:55:04 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201624</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201624</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201624</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/11/11/ddd-cqrs-post-event.aspx#comments</comments><description>&lt;p&gt;Bueno, tras una semana dura el evento de &lt;a href="http://www.iasaglobal.org/iasa/Spain_Chapter.asp?SnID=1327701029"&gt;IASA&lt;/a&gt; sobre DDD y CQRS que he tenido la suerte de co-organizar junto a Cesar de la torre y el resto de miembros fundadores de IASA, llega el momento de hacer un pequeño recopilatorio. La verdad, pensar al principio en tener a &lt;a href="http://www.domainlanguage.com/"&gt;Eric Evans&lt;/a&gt;, &lt;a href="http://www.udidahan.com/"&gt;Udi Dahan&lt;/a&gt; y &lt;a href="http://b"&gt;Diego Vega ( EF Team )&lt;/a&gt; en un evento gratuito abierto a todas las tecnologías era algo que nos parecía muy, pero muy complicado, por momentos imposible. Al final, gracias a los distintos patrocinadores el evento se pudo producir y disfrutamos de magníficas sesiones, por supuesto incluyo aquí al resto de participantes ( alfredo casado, jorge serrano etc..&amp;#160; y un servidor :-)).&lt;/p&gt;  &lt;p&gt;Además de todas estas charlas gratuitas, también teníamos dos dias de trabajo completos con &lt;a href="http://www.domainlanguage.com/"&gt;Eric Evas&lt;/a&gt; y &lt;a href="http://www.udidahan.com/"&gt;Udi Dahan&lt;/a&gt;, unos cursos por un precio más que razonable, yo diría que casi hasta regalado, que han tenido un gran aceptación y practicamente llenarons las plazas disponibles. Se, por mi propia experiencia y porque he podido hablar y conocer a muchos de los asistentes, que los cursos han sido muy bien aceptados y que todos repetiríamos….&lt;/p&gt;  &lt;p&gt;Os dejo una pequeña foto con Eric Evans, Udi Dahan, Diego Vega, Pierre, Javier Calvarro y Cesar de la Torre y un servidor&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/DSC_5F00_0034_5F00_7AD372B7.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="DSC_0034" border="0" alt="DSC_0034" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/DSC_5F00_0034_5F00_thumb_5F00_70AEABBF.jpg" width="644" height="430" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que esto lo podamos volver a repetir en &lt;a href="http://www.iasaglobal.org/iasa/Spain_Chapter.asp?SnID=1327701029"&gt;IASA Spain.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201624" width="1" height="1"&gt;</description></item><item><title>Intellitrace como tu sistema de rastreo</title><link>http://geeks.ms/blogs/unai/archive/2011/10/12/intellitrace-como-tu-sistema-de-rastreo.aspx</link><pubDate>Wed, 12 Oct 2011 11:53:16 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201141</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201141</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201141</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/10/12/intellitrace-como-tu-sistema-de-rastreo.aspx#comments</comments><description>&lt;p&gt;Hace ya un pequeño tiempo, observé desde la distancia una “discusión” acerca de las implementaciones de logging y tracing en nuestras aplicaciones. Lógicamente, muchos de los argumentos de este tipo de discusiones ya son más que de sobra conocidos, unos tiran por AOP otros les gusta la intercepción etc, etc.. Mi compañero Rodrigo, metido en esa conversación intentó primero hacer una diferenciación entre lo que realmente es logging, como información del proceso, y las trazas como información de rastreo únicamente válida para nosotros como desarrolladores. Después de este pequeño, pero importante inciso, alegó que pensar hoy en dia en “inventar” el sistema de trazas caía un poco dentro de “Reinventent the wheel” puesto que si trabajábamos en Visual Studio 2010 teníamos algo llamado &lt;strong&gt;Intellitrace&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Seguramente muchos conoceis &lt;strong&gt;intellitrace&lt;/strong&gt; de vuestros procesos de depuración con VS, sin embargo, también es posible utilizar Intellitrace fuera de visual studio y llevarlo por ejemplo a un entorno de producción para&lt;strong&gt; hacer una sesión de depuración en caso de necesitarlo. &lt;/strong&gt;A lo largo de la siguiente entrada veremos los pasos necesarios para realizar esta tarea, y como, gracias a Intellitrace, nuestras posibilidades en cuanto a las trazas se verán incrementadas enormemente:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Requisitos&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Lo primero siempre es lo que necesitamos, y en este caso, los requisitos necesarios para correr intellitrace viene marcados por una serie de archivos que tendremos que llevar a nuestro entorno, es importante notar que no requiere instalación tradicional ninguna.&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;Intellitrace.exe&lt;/strong&gt;, %ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Intellitrace.exe.config&lt;/strong&gt;,&amp;#160; %ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;TraceLogProfiler.dll&lt;/strong&gt;, %ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Microsoft.VisualStudio.Intellitrace.dll&lt;/strong&gt; %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;CollectionPlan.xml&lt;/strong&gt;,%ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools. &lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Puesta en marcha&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Una vez que hemos llevado estos requisitos hasta nuestro entorno, veremos como ejecutar intelligrace para un proceso, en mi caso, para el ejemplo he creado una pequeña aplicación de consola que trabaja con una base de datos, escribe un fichero, y accede a registro. La idea, es poder observar todo este trabajo desde el resultado de la ejecución de intellitrace. &lt;/p&gt;    &lt;p&gt;Levantaremos una linea de comandos y ejecutaremos algo como lo siguiente:&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;font style="background-color:#cccccc;"&gt;Intellitrace.exe launch cp:/CollectionPlan.xml /f:Out.itrace “path\sample.exe”&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Si se fija, los dos parámetros importantes de esta llamada son cp:/CollectionPlain y /f:Out.xml. CollectionPlan.xml nos permite especificar que es lo que queremos recopilar en nuestra sesión de trazas, es decir, la información que deseamos ver. El segundo parámetro, por otro lado, nos permite establecer el fichero de salida, el cual después llevaremos hasta un entorno con Visual Studio sobre el que podamos ver y analizar los resultados. Antes de empezar la ejecución, abriremos nuestro fichero de &lt;strong&gt;collectionplan.xml&lt;/strong&gt;, buscaremos el elemento &lt;strong&gt;TraceInstrumentation&lt;/strong&gt; y estableceremos el atributo &lt;strong&gt;enabled&lt;/strong&gt; a true.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160; &amp;lt;TraceInstrumentation enabled=&amp;quot;true&amp;quot;&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Análisis de resultados&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Bien, una vez que ya hemos ejecutado Intellitrace y obtenido el fichero de resultado ( nuestro *.iTrace) lo llevaremos hasta un equipo con Visual Studio, en este podremos ver algo similar a lo siguiente:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled1_5F00_0C15A3FC.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled1" border="0" alt="Untitled1" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled1_5F00_thumb_5F00_598220BC.png" width="644" height="371" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Realmente, aquí ya es similar a como si estuviésemos en una sesión de Visual Studio normal, podéis probar a ver los eventos de intellitrace, las llamadas a métodos, rebobinar etc etc….&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Queremos más&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;La información de llamadas a métodos, variables, hilos o módulos cargados no siempre es suficiente. Gracias a nuestro archivo CollectionPlan.xml podemos ir configurando la información que deseamos incluir en nuestros ficheros de &lt;strong&gt;Intellitrace&lt;/strong&gt;. Algunos eventos importantes son acceso a disco, ADO.NET, uso de registro etc etc… A continuación se puede ver la interacción con ADO.NET de nuestra pequeña aplicación de ejemplo.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/untitled2_5F00_568CBC09.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="untitled2" border="0" alt="untitled2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/untitled2_5F00_thumb_5F00_5BFB2CAD.png" width="644" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Ojo con el licenciamiento&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;En principio el uso de Intellitrace en producción es algo que se escapa a la licencia de Intellitrace, aunque es algo que no tengo tan claro si es solamente al soporte o una prohibición por algún motivo. Hay un post &lt;a href="http://www.edsquared.com/2010/02/12/Can+I+Collect+An+IntelliTrace+Log+In+Production.aspx"&gt;aquí&lt;/a&gt; dónde tocan este tema y se pueden extrar algunas conclusiones.&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;´Más información&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Sobre la linea de comando de intellitrace hay mucha información repartida en la web, para aquellos que deseais saber más os recomiendo empezar con algunos enlaces que os ayudarán en las primeras dudas:&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/ianhu/archive/2009/11/16/intellitrace-itrace-files.aspx" href="http://blogs.msdn.com/b/ianhu/archive/2009/11/16/intellitrace-itrace-files.aspx"&gt;http://blogs.msdn.com/b/ianhu/archive/2009/11/16/intellitrace-itrace-files.aspx&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;//especialmente interesante si quieres hacer intellitrace de algo que no sea un .exe, por ejemplo&amp;#160; IIS, un servicio de windows, etc..&lt;/p&gt;    &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/msaffer/archive/2010/12/07/using-intellitrace-outside-the-ide.aspx" href="http://blogs.msdn.com/b/msaffer/archive/2010/12/07/using-intellitrace-outside-the-ide.aspx"&gt;http://blogs.msdn.com/b/msaffer/archive/2010/12/07/using-intellitrace-outside-the-ide.aspx&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/ianhu/archive/2010/05/25/intellitrace-links.aspx" href="http://blogs.msdn.com/b/ianhu/archive/2010/05/25/intellitrace-links.aspx"&gt;http://blogs.msdn.com/b/ianhu/archive/2010/05/25/intellitrace-links.aspx&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Espero que esto os resulte de interes&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;  &lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201141" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Intellitrace/default.aspx">Intellitrace</category><category domain="http://geeks.ms/blogs/unai/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>ASP.NET MVC + WIF</title><link>http://geeks.ms/blogs/unai/archive/2011/10/06/asp-net-mvc-wif.aspx</link><pubDate>Thu, 06 Oct 2011 03:55:38 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201037</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=201037</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=201037</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/10/06/asp-net-mvc-wif.aspx#comments</comments><description>&lt;p&gt;Últimamente tengo poco tiempo para postear, mucho menos de lo que debería seguramente, y entre tarera y tarea a veces surgen temas como el que voy a contaros que quizás sean de ayuda para otras personas, eso espero por lo menos. En casi toda la documentación&amp;#160; y ejemplos de &lt;strong&gt;WIF&lt;/strong&gt; se tocan los RP pasivos con clientes de &lt;strong&gt;ASP.NET&lt;/strong&gt; tradicional. Si bien, seguramente aún hoy por hoy estos serán mayoría en los desarrollos actuales, seguro que, muchos estaréis pensando empezar vuestros proyectos en &lt;strong&gt;ASP.NET MVC&lt;/strong&gt; e intentar integrar &lt;strong&gt;Windows Identity Foundation&lt;/strong&gt; para delegar todo el trabajo de autenticación. A continuación intentaré mostraros los pasos necesarios para realizar esta tarea y aquellos detalles que debéis de tener en cuenta.&lt;/p&gt;  &lt;p&gt;Lo primero que haremos será partir de una aplicación MVC, cualquiera de los tipos de aplicación vale(internet,intranet,empty), una vez hecho esto, procederemos a agregar la referencia al STS con el que queremos trabajar. Como hemos hecho otras veces, esto lo realizaremos con la integración de las tools de WIF en Visual Studio, gracias a las cuales en los menus contextuales de nuestros proyectos web tendremos la entrada “ Add STS Reference” ( si no has visto nada de WIF, te recomiendo las entradas siguientes ( &lt;a href="http://geeks.ms/blogs/unai/archive/2011/04/27/wif-es-sencillo-250-salo-3-1.aspx"&gt;3-1&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/unai/archive/2011/05/03/wif-es-sencillo-250-salo-3-2.aspx"&gt;3-2&lt;/a&gt;) antes de seguir)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Seguiremos el asistente de WIF como hasta ahora hemos hecho en todos los ejemplos, en nuestro caso, creando un nuevo STS y adjuntándolo a la solución, imagen siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_4D02AEB8.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_28ADA469.png" width="644" height="445" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una vez completado el asistente podremos ver como en nuestra solución se ha incluído el nuevo proyecto del STS y además, se ha modificado “notablemente” el archivo de configuración de nuestro cliente MVC. Intentareamos ir desgranando todo lo que ha pasado con este asistente poco a poco:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;p&gt;Modificación del web.config del cliente mvc&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Una vez terminado el asistente, FedUtil.exe, nuestro web.config ha cambiado en unos cuantos puntos para agregar aquellos elementos necesarios para trabajr con WIF. En primer lugar, se ha incluído una nueva sección de configuración, llamada &lt;strong&gt;Microsoft.IdentityModel &lt;/strong&gt;tal y como podemos ver a continuación:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt; &amp;lt;configSections&amp;gt;
    &amp;lt;section name=&lt;span class="str"&gt;&amp;quot;microsoft.identityModel&amp;quot;&lt;/span&gt; 
             type=&lt;span class="str"&gt;&amp;quot;Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&lt;/span&gt; /&amp;gt;
  &amp;lt;/configSections&amp;gt;&lt;/pre&gt;

&lt;p&gt;Esta sección de configuración, nos permite establecer la configuración necesaria para trabajar con wif, por defecto la que vemos a continuación:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;lt;microsoft.identityModel&amp;gt;
  &lt;br /&gt;&amp;#160; &amp;lt;service&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;audienceUris&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add value=&amp;quot;&lt;a href="http://localhost:1477/&amp;quot;"&gt;http://localhost:1477/&amp;quot;&lt;/a&gt; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/audienceUris&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;federatedAuthentication&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;wsFederation passiveRedirectEnabled=&amp;quot;true&amp;quot; issuer=&amp;quot;&lt;a href="http://localhost:2511/MVCRP_STS/&amp;quot;"&gt;http://localhost:2511/MVCRP_STS/&amp;quot;&lt;/a&gt; realm=&amp;quot;&lt;a href="http://localhost:1477/&amp;quot;"&gt;http://localhost:1477/&amp;quot;&lt;/a&gt; requireHttps=&amp;quot;false&amp;quot; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;cookieHandler requireSsl=&amp;quot;false&amp;quot; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/federatedAuthentication&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;applicationService&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;claimTypeRequired&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--Following are the claims offered by STS &amp;#39;&lt;a href="http://localhost:2511/MVCRP_STS/&amp;#39;"&gt;http://localhost:2511/MVCRP_STS/&amp;#39;&lt;/a&gt;. Add or uncomment claims that you require by your application and then update the federation metadata of this application.--&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;claimType type=&amp;quot;&lt;a href="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name&amp;quot;"&gt;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name&amp;quot;&lt;/a&gt; optional=&amp;quot;true&amp;quot; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;claimType type=&amp;quot;&lt;a href="http://schemas.microsoft.com/ws/2008/06/identity/claims/role&amp;quot;"&gt;http://schemas.microsoft.com/ws/2008/06/identity/claims/role&amp;quot;&lt;/a&gt; optional=&amp;quot;true&amp;quot; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/claimTypeRequired&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/applicationService&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;issuerNameRegistry type=&amp;quot;Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;trustedIssuers&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add thumbprint=&amp;quot;6C6CE1DA53CE9F34F9DB4FFFAADDA8D84468C6BF&amp;quot; name=&amp;quot;&lt;a href="http://localhost:2511/MVCRP_STS/&amp;quot;"&gt;http://localhost:2511/MVCRP_STS/&amp;quot;&lt;/a&gt; /&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/trustedIssuers&amp;gt;

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/issuerNameRegistry&amp;gt;

  &lt;br /&gt;&amp;#160; &amp;lt;/service&amp;gt;

  &lt;br /&gt;&amp;lt;/microsoft.identityModel&amp;gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Algunos de estos elementos ya los hemos comentado, aún así, para no tener que andar viajando de entrada a entrada, volveremos a destacar los más importantes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;audienceUris&lt;/strong&gt;: Nos permite indicar la URI del cliente ( Relay Party), de forma general, el STS comprueba si el RP es válido para trabajar con el STS por medio del AudicenUri que se establece aquí.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;IssuerNameRegistry: &lt;/strong&gt;Mecanismo para comprobar que el certificado que utiliza el STS para cifrar los tokens es admisible por el RP, por defecto siempre se incluye un mecanismo que comprueba el thumbprint. El asistente, al crear un nuevo STS nos ha incluido un certificado llamado STSTestCert ( certificado autogenerado ) cuyo thumbprint es el que se ve aquí. Hablaremos más adelante sobre algún detalle de este certificado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otro de los detalles importantes en cuanto al cambio de la configuración de nuestro web.config, es que se han incluído dos nuevos módulos WSFAM y la SAM:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &amp;lt;system.webServer&amp;gt;
    &amp;lt;validation validateIntegratedModeConfiguration=&lt;span class="str"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; /&amp;gt;
    &amp;lt;modules runAllManagedModulesForAllRequests=&lt;span class="str"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;
      &amp;lt;add name=&lt;span class="str"&gt;&amp;quot;WSFederationAuthenticationModule&amp;quot;&lt;/span&gt; 
           type=&lt;span class="str"&gt;&amp;quot;Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&lt;/span&gt;
           preCondition=&lt;span class="str"&gt;&amp;quot;managedHandler&amp;quot;&lt;/span&gt; /&amp;gt;
      &amp;lt;add name=&lt;span class="str"&gt;&amp;quot;SessionAuthenticationModule&amp;quot;&lt;/span&gt; 
           type=&lt;span class="str"&gt;&amp;quot;Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&lt;/span&gt;
           preCondition=&lt;span class="str"&gt;&amp;quot;managedHandler&amp;quot;&lt;/span&gt; /&amp;gt;
    &amp;lt;/modules&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Estos módulos se encargan realmente de todo el trabajo, de redirigir las peticiones de usuarios no autenticados al STS, de guardar el token en la sesión, de recuperar este token entre distintos Request, y alguna cosa más que por ahora no es necesario comentar. Llegados hasta aquí, parece que todo el trabajo está hecho y comentado o sea que vamos a probar nuestro ejemplo, hacemos F5 y vemos que nuestro cliente MVC ( el RP ) automáticamente hace una redirección al STS para autenticarse en esta pieza, en nuestro ejemplo la uri de redirección sería algo como la siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://localhost:2511/MVCRP_STS/Login.aspx?ReturnUrl=%2fMVCRP_STS%2fdefault.aspx%3fwa%3dwsignin1.0%26wtrealm%3dhttp%253a%252f%252flocalhost%253a1477%252f%26wctx%3drm%253d0%2526id%253dpassive%2526ru%253d%25252f%26wct%3d2011-10-06T08%253a46%253a50Z&amp;amp;wa=wsignin1.0&amp;amp;wtrealm=http%3a%2f%2flocalhost%3a1477%2f&amp;amp;wctx=rm%3d0%26id%3dpassive%26ru%3d%252f&amp;amp;wct=2011-10-06T08%3a46%3a50Z" href="http://localhost:2511/MVCRP_STS/Login.aspx?ReturnUrl=%2fMVCRP_STS%2fdefault.aspx%3fwa%3dwsignin1.0%26wtrealm%3dhttp%253a%252f%252flocalhost%253a1477%252f%26wctx%3drm%253d0%2526id%253dpassive%2526ru%253d%25252f%26wct%3d2011-10-06T08%253a46%253a50Z&amp;amp;wa=wsignin1.0&amp;amp;wtrealm=http%3a%2f%2flocalhost%3a1477%2f&amp;amp;wctx=rm%3d0%26id%3dpassive%26ru%3d%252f&amp;amp;wct=2011-10-06T08%3a46%3a50Z"&gt;http://localhost:2511/MVCRP_STS/Login.aspx?ReturnUrl=%2fMVCRP_STS%2fdefault.aspx%3fwa%3dwsignin1.0%26wtrealm%3dhttp%253a%252f%252flocalhost%253a1477%252f%26wctx%3drm%253d0%2526id%253dpassive%2526ru%253d%25252f%26wct%3d2011-10-06T08%253a46%253a50Z&amp;amp;wa=wsignin1.0&amp;amp;wtrealm=http%3a%2f%2flocalhost%3a1477%2f&amp;amp;wctx=rm%3d0%26id%3dpassive%26ru%3d%252f&amp;amp;wct=2011-10-06T08%3a46%3a50Z&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fíjese que en la query string hay elementos importantes como dwsignin ( nos vamos a autenticar ) wtrealm ( el audience uri) y alguno más como el contexto de la fecha etc etc… Esta redirección nos lleva hasta la página por defecto del STS, en la cual podremos incluir nuestras credenciales. Si hemos creado el &lt;strong&gt;STS&lt;/strong&gt;, lógicamente tendremos que tocar esta pieza, tanto para todo lo que tenga que ver con estilo como la implementación correcta de la autenticación, selección del repositorio etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_55FF146C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled2" border="0" alt="Untitled2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_thumb_5F00_095AD7C9.png" width="644" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bien, una vez auténticados, en el STS por defecto no es necesario poner una password podemos ver que nos encontramos con un error de lo más explícito. Concretamente el error es:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult=&amp;quot;&amp;lt;trust:RequestSecuri...&amp;quot;).”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Esto, es debido a que el proceso de autenticación y creación del token implica un post a nuestro RP, concretamente podeis ver este proceso dentro del Default.aspx.cs del STS&lt;/p&gt;

&lt;pre class="csharpcode"&gt;              &lt;span class="rem"&gt;// Process signin request.&lt;/span&gt;
                SignInRequestMessage requestMessage = (SignInRequestMessage)WSFederationMessage.CreateFromUri( Request.Url );
                &lt;span class="kwrd"&gt;if&lt;/span&gt; ( User != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; User.Identity != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; User.Identity.IsAuthenticated )
                {
                    SecurityTokenService sts = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomSecurityTokenService( CustomSecurityTokenServiceConfiguration.Current );
                    SignInResponseMessage responseMessage = FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest( requestMessage, User, sts );
                    FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse( responseMessage, Response );
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; UnauthorizedAccessException();
                }&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Para arreglar este problema tenemos dos opciones, la más rápida y también la mas mala es cambiar el modo de validación de los request a 2.0 y establecer el validateRequest de la página a false. Lógicamente esto representa un compromismo de seguridad importante que no deberíamos admitir. La otra solución, es crearnos un RequestValidator personalizado. Para ello, lo único que tendremos que hacer es agregar una entrada en el system.web de nuestro config como la siguiente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&amp;lt;httpRuntime requestValidationType=&lt;span class="str"&gt;&amp;quot;MVCRP.WsFederationRequestValidator&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;Dónde WsFederationRequestValidator es el siguiente validador ( básicamente comprueba que en el request hay una clave de coleccón “wa” y es una respuesta de SignIn de un STS):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; WsFederationRequestValidator : RequestValidator
    {
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValidRequestString(HttpContext context, 
                                                    &lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, 
                                                    RequestValidationSource requestValidationSource,
                                                    &lt;span class="kwrd"&gt;string&lt;/span&gt; collectionKey, 
                                                    &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; validationFailureIndex)
        {
            validationFailureIndex = 0;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (requestValidationSource == RequestValidationSource.Form &amp;amp;&amp;amp;
                collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal))
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (WSFederationMessage.CreateFromFormPost(context.Request) &lt;span class="kwrd"&gt;as&lt;/span&gt; SignInResponseMessage != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                }
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.IsValidRequestString(context, &lt;span class="kwrd"&gt;value&lt;/span&gt;, requestValidationSource, collectionKey, &lt;span class="kwrd"&gt;out&lt;/span&gt; validationFailureIndex);
        }
    }&lt;/pre&gt;

&lt;p&gt;Ahora parece que si, que ya lo tenemos todo. Volvemos a probar y efectivamente, después de la redirección y el sigin ya podemos entrar a nuestro RP MVC:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_523149CF.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled3" border="0" alt="Untitled3" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled3_5F00_thumb_5F00_0448744D.png" width="644" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta ahora hemos visto casi todo lo relacionado con nuestro RP, y como solucionar el problema de los request no válidos, sin embargo, no sabemos por ahora nada de lo que el asistente haya hecho con respecto a nuestro nuevo STS. Algunas consideraciones interesantes son las referidas al uso de los certificados y como manejar estos en producción.&amp;#160; A continuación detalleremos esto un poco más.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Como seguramente ya sabéis el STS genera un colección de claims y las envuelve en un token de seguridad. Este token, para mantener su privacidad y que no se pueda alterar suele ( siempre ) ir firmado con un certificado digital. Por defecto, cuando creamos un STS automáticamente el asistente FedUtil nos crea e incluye en el almacén un certificado llamado STSTestCert.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled4_5F00_21DA4F4C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled4" border="0" alt="Untitled4" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled4_5F00_thumb_5F00_1F511D8E.png" width="644" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;


&lt;p&gt;Este certificado, se utiliza, como demuestran las siguientes lineas de código, dentro del Custom Security Token Service creado por el STS para encriptar los claims:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;scope.EncryptingCredentials = &lt;span class="kwrd"&gt;new&lt;/span&gt; X509EncryptingCredentials( CertificateUtil.GetCertificate( StoreName.My, StoreLocation.LocalMachine, encryptingCertificateName ) );&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Un problema habitual, es que cuando pasamos a producción y seguimos utilizando un certificado autogenerado es que la raiz de certificación no sea de confianza, por eso, si vais a hacer algun despliegue, por ejemplo en vuestro entorno de build, con un certificado de prueba tenéis que aseguraros que este certificado también se encuentre en los certificados de confianza de la máquina ( Trusted People). A mayores, si el despliguen en vuestro entorno de build lo hacéis en &lt;strong&gt;IIS&lt;/strong&gt;, tenéis también que aseguraros que el usuario que corra el pool de IIS tenga permisos para acceder a la clave privada del certificado.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Ahora, que ya hemos cerrado el tema de los certificados nos quedan algunos&amp;#160; elementos importantes que ver:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Gestión de los claims en el cliente MVC:&lt;/strong&gt; Bien, ahora ya hemos delegado la autenticación, pero como utilizamos el token resultado para validar por ejemplo la ejecución de uná acción de un controlador o retrigir controles en las vistas?. Respuestas a esto hay muchas, en realidad tantas como variantes de implementación podamos dar, puesto que, una vez que nos hemos autenticado con nuestro STS dentro de nuestro RP HttpContext.User contendrá un elemento de tipo IClaimsPrincipal con la información de la identidad autenticada y la lista de claims de las que dispone, es decir, con toda la información que necesitemos. De forma general, el trabajo de filtrado de acciones de controladores lo podemos hacer de forma declarativa utilizando algún filtro de autorización personalizado basado en las claims del usuario autenticado..( esto lo dejo para otra ocasión ).&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Elementos no autenticados en un RP: &lt;/strong&gt;Por supuesto, no todas las secciones de una cliente necesitan estar autenticadas, sin embargo, tal y como lo hemos hecho en nuestro ejemplo si tenemos este comportamiento. Para modificarlo, y decidir que controladores necesitan autenticación podríamos realizar los siguientes pasos:&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;Establecer el allow users a todos en nuestro elemento authorization de configuración del RP ( &amp;lt;allow users=&amp;quot;*&amp;quot;/&amp;gt;)&lt;/li&gt;

    &lt;li&gt;Crear un filtro de autenticación que obligara a los controladores (o acciones ) en los que lo situemos a realizar la autenticación con el &lt;strong&gt;STS&lt;/strong&gt;, es decir, algo similar a lo siguiente:&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;

&lt;pre class="csharpcode"&gt;   [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; WIFAuthenticationFilter
        :FilterAttribute,IAuthorizationFilter
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAuthorization(AuthorizationContext filterContext)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                var fam = FederatedAuthentication.WSFederationAuthenticationModule;

                var signIn = &lt;span class="kwrd"&gt;new&lt;/span&gt; SignInRequestMessage(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(fam.Issuer), fam.Realm)
                {
                    Context = GetReturnUrl(filterContext.RequestContext).ToString(),
                    HomeRealm = &lt;span class="str"&gt;&amp;quot;http://localhost:3299/Home/Index&amp;quot;&lt;/span&gt;
                };
                var result = &lt;span class="kwrd"&gt;new&lt;/span&gt; RedirectResult(signIn.WriteQueryString());
                filterContext.Result = result;
            }
        }
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Uri GetReturnUrl(RequestContext context)
        {
            var request = context.HttpContext.Request;
            var reqUrl = request.Url;
            var wreply = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();

            wreply.Append(reqUrl.Scheme); &lt;span class="rem"&gt;// e.g. &amp;quot;http&amp;quot;&lt;/span&gt;
            wreply.Append(&lt;span class="str"&gt;&amp;quot;://&amp;quot;&lt;/span&gt;);
            wreply.Append(request.Headers[&lt;span class="str"&gt;&amp;quot;Host&amp;quot;&lt;/span&gt;] ?? reqUrl.Authority);
            wreply.Append(request.RawUrl);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!request.ApplicationPath.EndsWith(&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;, StringComparison.OrdinalIgnoreCase))
            {
                wreply.Append(&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;);
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(wreply.ToString());
        }
    }&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;SignOut: &lt;/strong&gt;Lógicamente si nos autenticamos, también tenemos que tener un mecanismo de LogOf, para ello en WIF, podemos recurrir al &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.web.wsfederationauthenticationmodule.federatedsignout.aspx"&gt;WSFederationAuthenticationModule.FederatedSignOut&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Os cuelgo una aplicación de ejemplo &lt;a href="https://skydrive.live.com/redir.aspx?cid=43efbf16590d36f3&amp;amp;resid=43EFBF16590D36F3!127"&gt;aquí.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Espero que os resulte de interés&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201037" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/windows+Identity+Foundation/default.aspx">windows Identity Foundation</category><category domain="http://geeks.ms/blogs/unai/archive/tags/seguridad/default.aspx">seguridad</category><category domain="http://geeks.ms/blogs/unai/archive/tags/WIF/default.aspx">WIF</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Federation/default.aspx">Federation</category><category domain="http://geeks.ms/blogs/unai/archive/tags/STS/default.aspx">STS</category><category domain="http://geeks.ms/blogs/unai/archive/tags/MVC/default.aspx">MVC</category><category domain="http://geeks.ms/blogs/unai/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>EF vNext- Migrations 0.7.0.0</title><link>http://geeks.ms/blogs/unai/archive/2011/09/22/ef-vnext-migrations-0-7-0-0.aspx</link><pubDate>Thu, 22 Sep 2011 11:57:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200678</guid><dc:creator>Unai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=200678</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=200678</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/09/22/ef-vnext-migrations-0-7-0-0.aspx#comments</comments><description>&lt;p&gt;Las &lt;a href="http://geeks.ms/blogs/unai/archive/2011/09/15/ef-vnext-migrations-ii.aspx"&gt;dos últimas entradas&lt;/a&gt; de este blog trataban sobre una de las novedades ( una de las importantes ) que traerá la próxima version de EF llamada &lt;strong&gt;Migrations&lt;/strong&gt;. Ayer mismo, sacaron de forma publica una nueva revisión ( aún en version alfa, 0.7.0.0)&amp;#160; que presenta algunas novedades interesantes que me gustaría comentar aquí. Lógicmente no volveremos a hacer los &lt;strong&gt;walkthrough &lt;/strong&gt;de los post anteriores ( por supuesto puede también revisar el blog del grupo de ADO.NET con sus propias guias), sino que solamente vermos algunas de las novedades introducidas.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h4&gt;Puerta de entrada para introducir datos con la migración&lt;/h4&gt;  &lt;p&gt;Lo primero que llama la atención con esta nueva versión es que la clase &lt;strong&gt;Settings, &lt;/strong&gt;creada automáticamente cuando se agrega el paquete de migraciones, además de las opciones anteriores para establecer los generadores a utilizar nos proporciona un método para realizar un Seed de los datos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Settings : DbMigrationContext&amp;lt;CRMUnitOfWork&amp;gt;
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; Settings()
        {
            AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            SetCodeGenerator&amp;lt;CSharpMigrationCodeGenerator&amp;gt;();
            AddSqlGenerator&amp;lt;SqlConnection, SqlServerMigrationSqlGenerator&amp;gt;();
        }
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Seed(CRMUnitOfWork context)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!context.Customers.Any())
            {
                context.Customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() { FirstName = &lt;span class="str"&gt;&amp;quot;Unai&amp;quot;&lt;/span&gt; });
            }
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Seed(context);
        }   
    }&lt;/pre&gt;

&lt;p&gt;Este método Seed se ejecuta automáticamente cada vez que se hace una migración a la ultima versión. Bueno, aunque esto, aún parece que esta pillado con pinzas, sobre todo porque habría que discutir como afectan las migraciones hacia atrás con respecto a los datos etc… Es decir, parece que con todo lo que tenga que ver con Data Motion aún hay mucho por jugar. Veremos en las siguientes versiones que cariz toma esto.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;&lt;/h4&gt;

&lt;h4&gt;Update-Database –Verbose&lt;/h4&gt;

&lt;p&gt;El nuevo flag –Verbose nos permite ver en nuestro Package Manager la información del SQL a generar para realizar la actualización de la base de datos después de una migración. Así por ejemplo si ejecutamos este comando podríamos ver cosas como las que podemos observar en la figura de la derecha.&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_1516CC1C.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Untitled" border="0" alt="Untitled" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled_5F00_thumb_5F00_2B896AA3.png" width="549" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;



&lt;h4&gt;Downgrades&lt;/h4&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;En esta versión ya empezamos a tener la posibilidad de deshacer migraciones o situarnos en alguna migración en concreto, algo que ellos llaman &lt;strong&gt;downgrades. &lt;/strong&gt;Supongamos que estamos trabajando con este paquete y realizamos por ejemplo dos migraciones. La inicial de nuestro proyecto, &lt;strong&gt;First&lt;/strong&gt;, y después una llamada &lt;strong&gt;AddNotesProperty&lt;/strong&gt;. Pues bien, esta segunda migración nos generaría un código como podría ser el siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AddNotesProperty : DbMigration
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
        {
            AddColumn(&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Notes&amp;quot;&lt;/span&gt;, c =&amp;gt; c.String());
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Down()
        {
            DropColumn(&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Notes&amp;quot;&lt;/span&gt;);
        }
    }&lt;/pre&gt;
En este pequeño fragmento podemos ver como tenemos un método para “deshacer” la migración, en nuestro casi algo tan simple como eliminar la columna previamente creada en la tabla &lt;em&gt;Customers&lt;/em&gt;. Ahora,

&lt;p&gt; si quisiéramos movernos por ejemplo a la versión inicial de la base de datos podríamos ejecutar el siguiente comando:&lt;strong&gt; Update-Database –TargetMigration:First.&lt;/strong&gt;&amp;#160; Esto es realmente importante si por ejemplo nos queremos mover a una versión de código determinada y tenemos una base de datos por ejemplo posterior. Gracias a que todas las migraciones las tenemos disponibles como código dentro de la carpeta &lt;strong&gt;Migrations &lt;/strong&gt;podemos realizar esta tarea sin dificultad ninguna.El flag –TargetMigration tiene un argumento especial que es 0 y nos permite movernos directamente a la primera migración.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_59B34090.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="Untitled2" border="0" alt="Untitled2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/unai/Untitled2_5F00_thumb_5F00_580274BC.png" width="644" height="451" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;Notas:&lt;/h4&gt;

&lt;p&gt;Aunque en esta versión han arreglado la dependencia con SqlExpress, no se podía utilizar el paquete de migraciones sino se&amp;#160; disponia de una instancia con nombre .\SQLEXPRESS ( o en su defecto un alias) aún hay cosas que serían deseables y que no están. Como por ejemplo la posibilidad de usar toda la artillería de migraciones fuera de Visual Studio o el uso de Data Motion.&lt;/p&gt;







&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200678" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/unai/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.0/default.aspx">EF 4.0</category><category domain="http://geeks.ms/blogs/unai/archive/tags/Entity+Framework+4.0/default.aspx">Entity Framework 4.0</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+4.1/default.aspx">EF 4.1</category><category domain="http://geeks.ms/blogs/unai/archive/tags/EF+Migrations/default.aspx">EF Migrations</category></item><item><title>EF vNext-Migrations II</title><link>http://geeks.ms/blogs/unai/archive/2011/09/15/ef-vnext-migrations-ii.aspx</link><pubDate>Thu, 15 Sep 2011 21:20:41 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200539</guid><dc:creator>Unai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/rsscomments.aspx?PostID=200539</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/unai/commentapi.aspx?PostID=200539</wfw:comment><comments>http://geeks.ms/blogs/unai/archive/2011/09/15/ef-vnext-migrations-ii.aspx#comments</comments><description>&lt;p&gt; En la &lt;a href="http://geeks.ms/blogs/unai/archive/2011/09/12/ef-vnext-migrations-i.aspx"&gt;anterior entrega&lt;/a&gt; hemos visto como usar el nuevo paquete que a salido del equipo de Data Development en Redmon. En esta nueva entrada, intentaremos continuar con algunos detalles importantes que nos permitan comprender mejor con que estamos tratando.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Migraciones automáticas&lt;/h2&gt;  &lt;p&gt;Si recuerda, cada vez que ejecutamos una migración por medio del comando Add-Command se incorpora a nuestro proyecto el sacaffolding de la migración por medio de una clase de tipo &lt;strong&gt;DbMigration. &lt;/strong&gt;En alguna ocasión, puede que no nos interese tener estos ficheros de scaffolding y simplemente ejecutar la migración. A este proceso, se le conoce como migración automática. Para mostrar esto partiremos del código de la anterior entrada y modificaremos nuestra clase Customer agregandole una nueva&amp;#160; propiedad.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LastName { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Email { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Age { get; set; }
    }&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Bien, ahora para actualizar nuestro esquema, solamente tenemos que ejecutar el comando &lt;strong&gt;Update-Database&lt;/strong&gt;, sin necesidad de crear la migración. Para que esto funcione necesitamos establecer en la configuración de las migraciones, nuestra clase Settings, que habilite las migraciones automáticas, tal y como podemos ver en el siguiente fragmento.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Settings : DbMigrationContext&amp;lt;CRMUnitOfWork&amp;gt;
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; Settings()
        {
            AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            SetCodeGenerator&amp;lt;CSharpMigrationCodeGenerator&amp;gt;();
            AddSqlGenerator&amp;lt;SqlConnection, SqlServerMigrationSqlGenerator&amp;gt;();

            &lt;span class="rem"&gt;// Uncomment the following line if you are using SQL Server Compact &lt;/span&gt;
            &lt;span class="rem"&gt;// SQL Server Compact is available as the SqlServerCompact NuGet package&lt;/span&gt;
            &lt;span class="rem"&gt;// AddSqlGenerator&amp;lt;System.Data.SqlServerCe.SqlCeConnection, SqlCeMigrationSqlGenerator&amp;gt;();&lt;/span&gt;
        }
    }&lt;/pre&gt;

&lt;p&gt;Si bien la actualización automática del esquema es util, puede llegar a ser necesario disponer del script de actualización en vez de la ejecución de la migración directamente. Para disponer de este script, solamente tenemos que agregar el flag Script al comando anterior. La siguientes lines T-SQL se corresponden a una nueva migración en la que se ha incluido una propiedad Address.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;BEGIN TRANSACTION;
SET XACT_ABORT ON;
ALTER TABLE [Customers] ADD [Address] [nvarchar](max);
INSERT INTO [__MigrationHistory] (Migration, CreatedOn, Hash, Model) VALUES (&lt;span class="str"&gt;&amp;#39;Automatic Migration&amp;#39;&lt;/span&gt;, getdate(), 0x4EE620C904605E84D8F981B7A5B861D15FFB6BC5DB8F9B9945E924EB798B72A4, 0x1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22FEC7BFF71F7CFC7BBC5B94E9655E3745B5FCECA3DDF1CE4769BE9C56B36279F1D947EBF67CFBE0A3DFE3E8374E1E9FCE16EFD29F34EDF6D08EDE5C369F7D346FDBD5A3BB779BE93C5F64CD78514CEBAAA9CEDBF1B45ADCCD66D5DDBD9D9D83BBBB3B777302F111C14AD3C7AFD6CBB658E4FC07FD79522DA7F9AA5D67E517D52C2F1BFD9CBE79CD50D317D9226F56D934FFECA3A74FBE282EEAAC253C9A8FD2E3B2C80887D77979FE9E08ED3C04421FD9AEA8B35342AABD7E73BDCAB9C3CF3E3A59376DB5C86BBF15B5FBBDF2EBE003FAE8655DADF2BABD7E959FEBBB67B38FD2BBE17B77BB2FDAD7BC77D03DFDB66CEFED7D94BE5897653629E983F3AC6CF28FD2D5A78F5EB7559D7F9E2F7322423E7B99B56D5E2FF16ECEE82B191EAD3EBD1D251EDEDDD90325EE66CB65D5325D7B8877D07C56D44D8B5F0DB6AFDB9AF8E5A3F459F12E9F3DCF9717EDDC62FC45F6CE7C42BF7E947EB52C88BDE8A5B65EE7FE08E5EFCD3D3FCF7E8E3A3E5D6445F943EFF5F8C28E7488216E00309BD579D3FC2C23FEF8AE939C8DF2444AE48BBCCD66599BFD48A4023459EF7D3B6BE63FA753457AB8CD0A2283D17FAFBE20D8ED97E7DFADEAB79D1993375EE76D475712B3B92E44338FAD1EED52A10BC46390181C9F7FA2C3B2037016E4AE9810636AEE0ED89AC75F64AB1551DCB33DFA49FA5A0CCFC9F6EBF737310B817177DA442C8DC5D6F6447C985DE49D6FA96BC29495EE531AF924030F9CCC16FD66B7992ED35777D6BAE2E7886FDEC0EFF2966F83DDE47620380A3EA3412D4894787C3A3AC264C8BEEACBAFA75999D511713EA9CAF56239A41236BDED192E1F88F7F1ED613953E483729FDE1E92DA161F8C7E747B186C297C08FCC17BBC6F0C4500C37CD887F3F86E676EBBECE3E9196DD951DC5D86BC15BB06FAE16B73ECA01962303731EDC6B77F76F8D6B30E3E10EFE31FF20CF5F46DB789EDDDEADD8E7E7DACBA2E50C23CFEAEC3DF537ED2E4A394887459CCA0F85E5F376DBE18A3C1F8F52F2A4FCA82C6EB1A7C912D8BF3BC69DF546F73042FA49BBF7EE4608D7BD3CCCAFFB7860F05867FA357F39ECE64CFED5F5E66F5749ED55B8BECDD9DF7F56DBBAEFC07010BDCF30F82E4B9DC4CC4F7A451C7E17E0F54FEBFE144FFAC3096A7C7BE61B2F51CDA9E23356076BA12BCC9A7157DF4D947B349450310443D6FF8F62EEF4D1E6FACA36FC225EEABE2C777FD0CCDE3A779535C3810C8D72CF3298CA9036ADA9C2DCF2B33BF344A1F23D3A43BFD8AFF71DD16E7D9B4A5AFA724431CFEFC6456AE59BE27F9EC6CF9E5BA5DADDBE3A6C91793F2DA1FEFE3BB9BFB67BF3FC4F9F1972B7607BE8921109A050D21FF72F9645D94338BF7B33EFB0F81006BAA4C115614FE11B88B6B0BE945B5BC252025DFD37C952F21916FF2C5AA2460CD97CBD7D9653E8CDBCD340C29F6F86991914FB5F029289F2826AF33EAD9EB823AF0DF70FDD19FC4AE941E3CFA7F020000FFFFDE9A70EE93140000);
DELETE FROM [EdmMetadata];
INSERT INTO [EdmMetadata] ([ModelHash]) VALUES (&lt;span class="str"&gt;&amp;#39;7A1D3FB94B39A8198EF177EDE6FF734EE97083E664B613C98EA9F74BA468B42F&amp;#39;&lt;/span&gt;);
COMMIT TRANSACTION;&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Con esto hemos acabado esta primera mini-serie sobre las migraciones. Esperemos que se siga trabajando en completar nuevas features y seguir escuchando todo el feedback que la comunidad está aportando.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;

&lt;p&gt;Unai&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200539" width="1" height="1"&gt;</description></item></channel></rss>
