<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/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>Angel "Java" Lopez : NHibernate</title><link>http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx</link><description>Tags: NHibernate</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Generando código con AjGenesis usando archivos de mapeo de NHibernate</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/23/generating_2D00_code_2D00_with_2D00_ajgenesis_2D00_using_2D00_nhibernate_2D00_hbm_2D00_files.aspx</link><pubDate>Mon, 23 Nov 2009 09:18:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1741719</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1741719</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/23/generating_2D00_code_2D00_with_2D00_ajgenesis_2D00_using_2D00_nhibernate_2D00_hbm_2D00_files.aspx#comments</comments><description>&lt;p&gt;En estos días, estuve trabajando en generar código de clases C#, usando como punto de partida los archivos .hbm, que se usan en &lt;a href="http://nhforge.org" target="_blank"&gt;NHibernate&lt;/a&gt; para especificar el mapeo de clases y tablas de bases relacionales. Como es usual, cuando encaro algo de generación de código uso &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto open source de generación de código (practico el “dog fooding” :-).&lt;/p&gt;  &lt;p&gt;(English version of this post &lt;a href="http://ajlopez.wordpress.com/2009/11/22/generating-code-with-ajgenesis-using-nhibernate-hbm-files/" target="_blank"&gt;Generating code with AjGenesis using NHibernate hbm files&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Pueden bajar un ejemplo de lo que estoy haciendo de mi Skydrive:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/AjGenesis/NHibernateMappingExample01.zip" target="_blank"&gt;Examples &amp;gt; AjGenesis &amp;gt; NHibernateMappingExample01.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(el código en desarrollo está en el trunk, en &lt;a href="http://ajgenesis.codeplex.com/sourcecontrol/changeset/view/61684?projectName=ajgenesis#" target="_blank"&gt;este change actual&lt;/a&gt;, en el directorio examples\NHibernateMappinp:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh03.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;pero si quieren ir directamente al ejemplo, pueden bajárselo completo desde el Skydrive que mencioné, que incluye el ejecutable de AjGenesis de la versión en desarrollo, no necesitan compilar nada).&lt;/p&gt;  &lt;p&gt;Luego de expandir el archivo del ejemplo, tendrán este contenido:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh02.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Para crear clases C#, pueden probar de ejecutar los comandos:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;GenerateClasses AjFirstExample
GenerateClasses AjTest&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Para crear un proyecto .NET con los archivos .cs y .hbm, y una solución, ejecutar:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;GenerateProject AjFirstExample
GenerateProject AjTest&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Los archivos generados, en ambos casos, quedan en el directorio Build.&lt;/p&gt;

&lt;p&gt;Hay dos proyectos ejemplo que son AjFirstExample, con dos mapeos simples, y AjTest, que tiene mapeos más interesantes, con “bags” y relaciones “many to one”.&lt;/p&gt;

&lt;p&gt;En el ejemplo, cada proyecto se describe con un simple archivo Project.xml:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;En cuanto necesite más información, lo agregaré ahí, o en tags meta de los propios archivos de mapeo y configuración.&lt;/p&gt;

&lt;p&gt;Este es uno de los archivos de mapeo que sirven de modelo inicial para este ejemplo de generación, en Projects\AjTest\Mappings, Department.hbm:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;mapping&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt;
  &lt;span style="color:#ff0000;"&gt;assembly&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities&amp;quot;&lt;/span&gt;
  &lt;span style="color:#ff0000;"&gt;namespace&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities&amp;quot;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Department&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;table&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;departments&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;column&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Int32&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;generator&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;native&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;bag&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;lazy&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;inverse&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;cascade&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;pre style="margin:0px;width:100%;font-size:12px;background-color:#ffffff;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;column&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;IdDepartment&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;one&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;to&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;many&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities.Employee, AjTest.Entities&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;bag&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate&lt;/span&gt;-mapping&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Este es el código generado para este mapeo, Department.generated.cs:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Iesi.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; AjTest.Entities 
{
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Department {
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Description { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;Employee&amp;gt; Employees { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Department() 
    {
      &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Employees = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;();
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Veamos el proceso de generación. Este es el contenido de GenerateProject.cmd:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;@echo off
&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; ProjectName=%1%
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &amp;quot;&lt;span style="color:#8b0000;"&gt;%1%&lt;/span&gt;&amp;quot;==&amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; ProjectName=AjFirstExample
Bin\AjGenesis.Console.exe Projects\%ProjectName%\Project.xml Tasks\AddMappings.ajg Tasks\BuildCSharp.ajg
xcopy Libraries\*.* Build\%ProjectName%\CSharp\Src\Libraries /Y /Q&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;La línea más importante es la que invoca a AjGenesis.Console.exe. El contenido de Project.xml se carga en memoria. La tarea AddMapping.ajg se carga y ejecuta (está escrita en un lenguaje dinámico, afectuosamente llamado AjBasic), y luego, se procesa la tarea BuildCSharp.ajg. Veamos el código de AddMapping.ajg:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Add mappings from directory if not specified in Project model&lt;/span&gt;
Include(&amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/Utilities.tpl&lt;/span&gt;&amp;quot;)
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Mappings &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
  Project.Mappings = CreateList()
  
  di = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.IO.DirectoryInfo(&amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings&lt;/span&gt;&amp;quot;)
  
  &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; fi &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; di.GetFiles(&amp;quot;&lt;span style="color:#8b0000;"&gt;*.hbm.xml&lt;/span&gt;&amp;quot;)
    filename = fi.Name
    Project.Mappings.Add(filename.Substring(0, filename.Length - 8))
  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Encuentra y agrega los nombres de los archivos de mapeo contenidos en el directorio de Mapping, dentro del proyecto (noten que se pueden usar clases y objetos del framework .NET). Una tarea más interesante es la GenerateCSharp.ajg. Primero, carga la dll de NHibernate, para usar más adelante su parser de archivos hbm:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/Utilities.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/FileUtilities.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/TypeUtilities.tpl&lt;/span&gt;&amp;quot;
Include(&amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/NHibernateUtilities.tpl&lt;/span&gt;&amp;quot;)
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/UtilitiesCs.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/CSharpFunctions.tpl&lt;/span&gt;&amp;quot;
AssemblyManager.LoadFrom(&amp;quot;&lt;span style="color:#8b0000;"&gt;Libraries/NHibernate.dll&lt;/span&gt;&amp;quot;)
parser = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NHibernate.Cfg.MappingSchema.MappingDocumentParser()
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Crea objetos dinámicos, donde coloca información de la solución y el proyecto a crear:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.BuildDir &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
  Project.BuildDir = &amp;quot;&lt;span style="color:#8b0000;"&gt;Build/${Project.Name}/CSharp&lt;/span&gt;&amp;quot;
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Creating Directories...&lt;/span&gt;&amp;quot;
FileManager.CreateDirectory(Project.BuildDir)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Sql&lt;/span&gt;&amp;quot;)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src&lt;/span&gt;&amp;quot;)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/Libraries&lt;/span&gt;&amp;quot;)
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Defining Solution and Projects...&lt;/span&gt;&amp;quot;
Project.Solution = CreateObject()
Project.Solution.Guid = &amp;quot;&lt;span style="color:#8b0000;"&gt;FAE04EC0-301F-11D3-BF4B-00C04F79EFBC&lt;/span&gt;&amp;quot;
Project.Solution.Projects = CreateList()
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Defining Entities Project...&lt;/span&gt;&amp;quot;
PrjEntities = CreateObject()
PrjEntities.Includes = CreateList()
PrjEntities.Guid = CreateGuid()
PrjEntities.COMGuid = CreateGuid()
Project.Solution.Projects.Add(PrjEntities)
Project.Entities = CreateList()
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ahora, itera sobre cada archivo hbm, lo lee usando el parser del propio NHibernate, toma información sobre las clases a generar:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; MappingName &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Mappings
  filename = &amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  mapping = parser.Parse(OpenAsStream(filename))
    
  &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; hbmclass &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; mapping.Items where IsType(hbmclass, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmClass&lt;/span&gt;&amp;quot;)
    Entity = CreateObject()
    
    Project.Entities.Add(Entity)
  
    Entity.ClassName = hbmclass.name
    Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt; = mapping.&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;
    
    &lt;span style="color:#008000;"&gt;&amp;#39; Namespace as default project name for Entities Project&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; PrjEntities.Name &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
      PrjEntities.Name = mapping.&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;
      PrjEntities.Directory = &amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/${PrjEntities.Name}&lt;/span&gt;&amp;quot;
      FileManager.CreateDirectory(PrjEntities.Directory)
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    
    Entity.Properties = CreateList()
    
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; hbmclass.Id &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = hbmclass.Id.name
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(hbmclass.Id.type1, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
      Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    
    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; hbmclass.Items
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmProperty&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.type1, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmManyToOne&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmSet&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.IsSet = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.Item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmBag&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.IsList = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.Item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;    
  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pueden extender esta capacidades, procesando más tags (debería escribir un ejemplo usando los tags meta que puede contener el hbm; ya utilitarios de Java, como el venerable XDocLet, usaban esos tags para ayudarse en la generación de código, en Hibernate), y detectar más formas de mapeo de NHibernate. Ahora, pasa a la generación de código:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; Entity &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Entities
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/Entity.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${PrjEntities.Directory}/${Entity.ClassName}.generated.cs&lt;/span&gt;&amp;quot;, Environment)
  PrjEntities.Includes.Add(CreateFileCs(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Entity.ClassName}.generated&lt;/span&gt;&amp;quot;))
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;La tarea genera los archivos .cs, y también crea un archivo de solución y otro de proyecto C#, copiando y embebiendo los archivos de mapeo originales:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; MappingName &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Mappings
  filename = &amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  targetfilename = &amp;quot;&lt;span style="color:#8b0000;"&gt;${PrjEntities.Directory}/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  System.IO.File.Copy(filename, targetfilename, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)
  PrjEntities.Includes.Add(CreateFileType(MappingName,&amp;quot;&lt;span style="color:#8b0000;"&gt;hbm.xml&lt;/span&gt;&amp;quot;))
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; CsProject &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Solution.Projects where CsProject.ProjectType&amp;lt;&amp;gt;&amp;quot;&lt;span style="color:#8b0000;"&gt;Web&lt;/span&gt;&amp;quot;
  FileManager.CreateDirectory(CsProject.Directory)
  FileManager.CreateDirectory(CsProject.Directory &amp;amp; &amp;quot;&lt;span style="color:#8b0000;"&gt;/Properties&lt;/span&gt;&amp;quot;)
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/CsProject.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${CsProject.Directory}/${CsProject.Name}.csproj&lt;/span&gt;&amp;quot;, Environment)
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/AssemblyInfoCs.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${CsProject.Directory}/Properties/AssemblyInfo.cs&lt;/span&gt;&amp;quot;, Environment)
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/Solution.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/${Project.Name}.sln&lt;/span&gt;&amp;quot;, Environment)
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Esta es la solución generada:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh01.png" alt="" /&gt;&lt;/p&gt;

&lt;h3&gt;Próximos pasos&lt;/h3&gt;

&lt;p&gt;Debería trabajar en algunos puntos:&lt;/p&gt;

&lt;p&gt;- Generar una solución más completa, como en otros ejemplos de AjGenesis (con un proyecto de infraestructura, un proyecto de Service Layer o similar, una presentación web, etc…).&lt;/p&gt;

&lt;p&gt;- Soportar más opciones de mapeo de NHibernate.&lt;/p&gt;

&lt;p&gt;- Usar los tags meta.&lt;/p&gt;

&lt;p&gt;Por ahora, pueden jugar con este ejemplo. Pueden cambiar los templates para generar más artefactos, por ejemplo, código VB.NET.&lt;/p&gt;

&lt;p&gt;Gracias a &lt;a href="http://twitter.com/fabiomaulo" target="_blank"&gt;@fabiomaulo&lt;/a&gt; por avisarmr de las capacidades públicas de parser de hbm dentro de NHibernate!&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1741719" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>NHibernate en SQL Azure</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/03/nhibernate-en-sql-azure.aspx</link><pubDate>Tue, 03 Nov 2009 16:12:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1737380</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1737380</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/03/nhibernate-en-sql-azure.aspx#comments</comments><description>&lt;p&gt;El viernes pasado, estuve hablando con &lt;a href="http://fabiomaulo.blogspot.com" target="_blank"&gt;Fabio Maulo&lt;/a&gt; (&lt;a href="http://twitter.com/fabiomaulo" target="_blank"&gt;@fabiomaulo&lt;/a&gt;) de varios temas: de desarrollo de software, enseñanza de la programación, y por supuesto, sobre NHibernate. Ambos vivimos en Buenos Aires, Argentina, y fue un placer hablar con él, como siempre. Yo sigo a Fabio en Twitter, y soy un subscripto a&amp;#160; &lt;a href="http://fabiomaulo.blogspot.com" target="_blank"&gt;su blog&lt;/a&gt;. Fabio ha estado colaborando con el proyecto NHibernate desde hace años, y es un reconocido desarrollador en la comunidad .NET.&lt;/p&gt;  &lt;p&gt;Me contó detalles de un sitio que construyó con un equipo, usando NHibernate. Lo interesate es que corre sobre SQL Azure. Pueden verlo en línea (es un sitio mexicano):&lt;/p&gt;  &lt;p&gt;&lt;a title="http://salondetokio.autocosmos.com.mx/" href="http://salondetokio.autocosmos.com.mx/"&gt;http://salondetokio.autocosmos.com.mx/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nhibernateazure01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Fabio y su equipo trabajaron duro para armar este sitio, en menos de mes (estoy esperando que el equipo de Fabio comente más detalles en posts, por ahora, puedo hablar sobre lo que se conoce públicamente).&lt;/p&gt;  &lt;p&gt;Curiosamente, el sitio está ejecutando sobre WebForms, pero sin usar ViewState, y sin tener un tag de Form en varios de los tags Body de las páginas que he examinado. Espero que Maulo y su equipo escriban explicando los detalles de implementación. El código está basado en el patrón Model View Presenter, ha sido escrito con tests automáticos, mocks, stubs, comenzando desde cerca de la presentación, hasta llegar a la persistencia. ¡Vamos Fabio! ¡Estamos esperando detalles sobre el proceso seguido y las decisiones de arquitectura! :-)&lt;/p&gt;  &lt;p&gt;Más información sobre NHiberante y SQL Azure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/archive/2009/09/05/nhibernate-on-the-cloud-sql-azure.aspx"&gt;NHibernate on the cloud: SQL Azure&lt;/a&gt; Tests de NHibernate sobre SQL Azure, según Ayende&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fabiomaulo.blogspot.com/2009/09/quick-news-nhibernate-with-sql-azure.html"&gt;Quick news NHibernate with SQL Azure&lt;/a&gt; Los primeros pasos de Fabio en el tema: “All work… even the SchemaExport.” !!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fabiomaulo.blogspot.com/2009/10/nhibernate-dialect-for-sql-azure.html"&gt;NHibernate dialect for SQL Azure&lt;/a&gt; Ajustes para el SchemaExport&lt;/p&gt;  &lt;p&gt;Estoy coleccionando enlaces sobre NHibernate y Azure en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://delicious.com/ajlopez/nhibernate+azure" href="http://delicious.com/ajlopez/nhibernate+azure"&gt;http://delicious.com/ajlopez/nhibernate+azure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay una excelente serie de posts de Brad Adams, explicando Azure en general, SQL Azure, NHibernate, Silverlight, RIA .NET Services, y más:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/10/27/index-for-business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update.aspx" target="_blank"&gt;Index for Business Apps example for Silverligth 3 RTM and .NET RIA Services July Update&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Relacionado a NHibernate y Azure, en esa serie:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/08/06/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-nhibernate.aspx" target="_blank"&gt;Part 20: NHibernate&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/08/21/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-23-azure.aspx" target="_blank"&gt;Part 23: Azure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;¿Conocen otro proyecto que use NHibernate en “el cloud”?&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1737380" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Azure/default.aspx">Azure</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Cloud+Computing/default.aspx">Cloud Computing</category></item><item><title>Primer ejemplo con NHibernate 2.x</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/04/first_2D00_nhibernate_2D00_2_2D00_x_2D00_example.aspx</link><pubDate>Thu, 04 Jun 2009 09:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693849</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1693849</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/04/first_2D00_nhibernate_2D00_2_2D00_x_2D00_example.aspx#comments</comments><description>&lt;p&gt;Estuve trabajando creando una soluci&amp;oacute;n .NET que contiene un ejemplo m&amp;iacute;nimo de NHibernate 2.x. Estoy usando la distribuci&amp;oacute;n binaria NHibernate GA 2.0.1, siguiendo las instrucciones del manual de referencia.&lt;/p&gt;
&lt;p&gt;Pueden bajarse el c&amp;oacute;digo fuente de la soluci&amp;oacute;n de mi Skydrive:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/NHibernate/NHibernateExample1.zip"&gt;NHibernateExample1.zip&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estuve usando la documentaci&amp;oacute;n en l&amp;iacute;nea de&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nhforge.org/doc/nh/en/" title="http://nhforge.org/doc/nh/en/"&gt;http://nhforge.org/doc/nh/en/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;y arm&amp;eacute; el mismo manual en formato .pdf, usando comandos del trunk de SVN:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nhibernate.svn.sourceforge.net/svnroot/nhibernate" title="https://nhibernate.svn.sourceforge.net/svnroot/nhibernate"&gt;https://nhibernate.svn.sourceforge.net/svnroot/nhibernate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si quieren, pueden bajar el manual en .pdf de este enlace:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.todocontenidos.com/images/articles/nhibernate-reference.pdf"&gt;nhibernate-reference.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n contiene dos proyectos: una librer&amp;iacute;a de clases, y una aplicaci&amp;oacute;n de consola:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-02.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El dominio s&amp;oacute;lo contiene una clase, Cat (estoy siguiendo el primer ejemplo que se describe en la documentaci&amp;oacute;n):&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;namespace NHibernateExample1.Domain
{
    public class Cat
    {
        private string id;
        private string name;
        private char sex;
        private float weight;

        public Cat()
        {
        }
        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name
        {
            get { return name; }
            set { name = value; }
        }

        public virtual char Sex
        {
            get { return sex; }
            set { sex = value; }
        }

        public virtual float Weight
        {
            get { return weight; }
            set { weight = value; }
        }
    }
}

Hay un recurso embebido que describe el mapeo Cat.hbm.xml:&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;hibernate-mapping xmlns=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;
namespace=&amp;quot;NHibernateExample1.Domain&amp;quot; assembly=&amp;quot;NHibernateExample1.Domain&amp;quot;&amp;gt;
  &amp;lt;class name=&amp;quot;Cat&amp;quot; table=&amp;quot;Cats&amp;quot;&amp;gt;
    &amp;lt;!-- A 32 hex character is our surrogate key. It&amp;#39;s automatically
generated by NHibernate with the UUID pattern. --&amp;gt;
    &amp;lt;id name=&amp;quot;Id&amp;quot;&amp;gt;
      &amp;lt;column name=&amp;quot;CatId&amp;quot; sql-type=&amp;quot;char(32)&amp;quot; not-null=&amp;quot;true&amp;quot;/&amp;gt;
      &amp;lt;generator class=&amp;quot;uuid.hex&amp;quot; /&amp;gt;
    &amp;lt;/id&amp;gt;
    &amp;lt;!-- A cat has to have a name, but it shouldn&amp;#39; be too long. --&amp;gt;
    &amp;lt;property name=&amp;quot;Name&amp;quot;&amp;gt;
      &amp;lt;column name=&amp;quot;Name&amp;quot; length=&amp;quot;16&amp;quot; not-null=&amp;quot;true&amp;quot; /&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;Sex&amp;quot; /&amp;gt;
    &amp;lt;property name=&amp;quot;Weight&amp;quot; /&amp;gt;
  &amp;lt;/class&amp;gt;
&amp;lt;/hibernate-mapping&amp;gt;&lt;/pre&gt;
&lt;p&gt;Hay un ExecuteAll.cmd en el directorio Sql, que crea la base de datos a usar (pueden darle como par&amp;aacute;metro el servidor de MS SQL Server a usar,&amp;nbsp; .\SQLEXPRESS es el valor asumido):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-03.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La aplicaci&amp;oacute;n de consola es simple: configura NHibernate, obtiene una sesi&amp;oacute;n, inserta nuevos objetos en una transacci&amp;oacute;n, ejecuta una consulta, y lista el resultado:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;        static void Main(string[] args)
        {
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

            ISession session = sessionFactory.OpenSession();
            ITransaction tx = session.BeginTransaction();

            Cat cat;

            cat = new Cat() { Name = &amp;quot;Moe&amp;quot;, Sex = &amp;#39;M&amp;#39;, Weight = 9.0f };

            session.Save(cat);

            cat = new Cat() { Name = &amp;quot;Larry&amp;quot;, Sex = &amp;#39;M&amp;#39;, Weight = 8.5f };

            session.Save(cat);

            cat = new Cat() { Name = &amp;quot;Sue&amp;quot;, Sex = &amp;#39;F&amp;#39;, Weight = 7.5f };

            session.Save(cat);

            tx.Commit();

            IQuery query = session.CreateQuery(&amp;quot;select c from Cat as c where c.Sex = :sex&amp;quot;);

            query.SetCharacter(&amp;quot;sex&amp;quot;, &amp;#39;M&amp;#39;);

            foreach (Cat kitty in query.Enumerable())
                System.Console.Out.WriteLine(&amp;quot;Male Cat: &amp;quot; + kitty.Name);

            session.Close();

            System.Console.ReadLine();
        }&lt;/pre&gt;
&lt;p&gt;Ejecutando la aplicaci&amp;oacute;n de consola se inserta en la base estos datos:&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-01.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El ejemplo es simple. Ahora que est&amp;aacute; funcionando con NHibernate 2.0, pienso actualizar mis templates de AjGenesis para usar esa versi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;No dejen de visitar el sitio de comunidad de NHibernate, para conseguir m&amp;aacute;s informaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nhforge.org"&gt;http://nhforge.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si tienen dudas sobre NHibernate, pueden preguntar en el grupo en espa&amp;ntilde;ol:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/NHibernate-Hispano" title="NHibernate-Hispano"&gt;NHibernate-Hispano&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1693849" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category></item><item><title>Enlaces y noticias</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx</link><pubDate>Thu, 24 Jul 2008 11:48:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641989</guid><dc:creator>lopez</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1641989</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx#comments</comments><description>&lt;p&gt;Hay varios temas de los que quisiera bloguear más en detalle. Pero vaya hoy una lista de enlaces y comentarios cortos:&lt;/p&gt; &lt;p&gt;Primero de todo, tenemos nuevos Microsoft MVPs por aquí en Argentina, felicitaciones a &lt;a title="Rodolfo Finochietti" href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2008/07/01/mvp-award-in-client-application-development.aspx"&gt;Rodolfo Finochietti&lt;/a&gt;, &lt;a title="archi" href="http://www.clariusconsulting.net/blogs/pga/archive/2008/07/01/77156.aspx"&gt;Pablo Galiano&lt;/a&gt;, y al pibe &lt;a href="http://blogs.southworks.net/mwoloski/2008/07/02/microsoft-mvp-award/" target="_blank"&gt;Matías Woloski&lt;/a&gt;. El bueno de Finochietti visita de vez en cuando este blog, y deja comentarios, por ejemplo, sobre programación funcional&amp;nbsp;y el lenguaje Cat. Tenemos varios intereses en común, como el estudio de lenguajes, compiladores, y compartimos la afición por la historia de las matemáticas. &lt;/p&gt; &lt;p&gt;Si se interesan en Smalltalk, es interesante &lt;a href="http://www.outbacksoftware.com/smalltalk/smalltalk.html" target="_blank"&gt;The Smalltalk programming language&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Gracias al bueno de Martin Salias, que me avisó de este texto en la web&amp;nbsp;&lt;a title="The Early History of Smalltalk" href="http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html"&gt;The Early History of Smalltalk&lt;/a&gt;&amp;nbsp;de Alan Kay (yo había anunciado una versión en PDF en &lt;a title="La historia de Smalltalk" href="http://msmvps.com/blogs/lopez/archive/2008/06/26/la-historia-de-smalltalk.aspx"&gt;La historia de Smalltalk&lt;/a&gt;). Es un &amp;quot;DEBESERLEIDO&amp;quot; por todo aquel que esté realmente interesado en la programación. Uno debe conocer la historia de las ideas, para realmente entender la situación actual tanto de ideas, como de tecnologías, y para tener un &amp;quot;grasp&amp;quot; de lo que podría venir.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.modumobile.com/#/modu_story/" target="_blank"&gt;Modu&lt;/a&gt;: gracias al twitter de &lt;a href="http://twitter.com/parancibia" target="_blank"&gt;@parancibia&lt;/a&gt;, vean este mobile modular. Muy interesante el concepto.&lt;/p&gt; &lt;p&gt;De vez en cuando, &lt;a href="http://www.directionsonmicrosoft.com/" target="_blank"&gt;Microsoft Directions&lt;/a&gt; publica un artículo público. Lean &lt;a href="http://www.directionsonmicrosoft.com/sample/DOMIS/update/2008/07jul/0708spsad.htm" target="_blank"&gt;Software Plus Services and Developers&lt;/a&gt;. ¿The next big thing?&lt;/p&gt; &lt;p&gt;Dentro del proyecto NHContrib, de herramientas para NHibernate, existe NHibernate.LINQ, que permite usar LINQ sobre NHibernate. Vean ahora lo que se hizo con Silverligh en &lt;a href="http://wildermuth.com/2008/07/20/Silverlight_2_NHibernate_LINQ_==_Sweet"&gt;Silverlight 2 + NHibernate.LINQ == Sweet&lt;/a&gt;&amp;nbsp;y el ejemplo de &lt;a title="nhibernat" href="http://www.silverlightdata.com/simple/nhibernate.aspx"&gt;nhibernate con Northwind&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para aprender NHibernate &lt;a title="NHibernate - Relational Persistence for Idiomatic .NET" href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/"&gt;NHibernate - Relational Persistence for Idiomatic .NET&lt;/a&gt;. Si quieren contribuir al proyecto &lt;a title="hibernate.org - Getting Started with the NHibernate Source Code" href="http://www.hibernate.org/428.html"&gt;hibernate.org - Getting Started with the NHibernate Source Code&lt;/a&gt;. Si tienen dudas, ver &lt;a href="http://groups.google.com/group/NHibernate-Hispano" target="_blank"&gt;la lista de NHibernate Hispano&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Siguiendo con LINQ, leo cómo usar un DataContext en memoria, esta vez desde ASP.NET MVC, en &lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/07/19/asp-net-mvc-tip-21-fake-the-data-context.aspx" target="_blank"&gt;ASP.NET MVC Tip #21 – Fake the Data Context&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Las aventuras de &lt;a href="http://www.hanselman.com/" target="_blank"&gt;Scott Hanselman&lt;/a&gt; para agregar un OpenSearch en sus páginas: &lt;a title="Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box" href="http://www.hanselman.com/blog/AddingOpenSearchToYourWebsiteAndGettingInTheBrowsersSearchBox.aspx"&gt;Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/stevecla01/" target="_blank"&gt;Steve Clayton&lt;/a&gt; está en Software + Services en Microsoft. Lean &lt;a href="http://blogs.msdn.com/stevecla01/archive/2008/07/21/my-us-tour-closes-out-with-ozzie.aspx" target="_blank"&gt;su encuentro con Ray Ozzie&lt;/a&gt;, no puede decir todo, pero S+S se viene cada vez más. El tiempo dirá qué será eso.&lt;/p&gt; &lt;p&gt;No llegué a tiempo para anunciarla. Diego Jancic realizó una encuesta en línea sobre cómo programamos. &lt;a href="http://blog.darioquintana.com.ar/2008/07/18/resultado-de-encuesta-como-programamos/" target="_blank"&gt;Vean los resultados&lt;/a&gt; en &lt;a href="http://blog.darioquintana.com.ar" target="_blank"&gt;el blog de Darío Quintana&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El Composite Application Guidance para WPF tiene &lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx" target="_blank"&gt;su nueva página en MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; tiene algunas ideas interesantes y discutibles sobre &lt;a href="http://www.codinghorror.com/blog/archives/001152.html" target="_blank"&gt;no normalizar base de datos&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/LearningOpportunityNETTerrariumIsBack.aspx" target="_blank"&gt;.NET Terrarium está de vuelta&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Me interesó el &lt;a href="http://jackrabbit.apache.org/jackrabbit-architecture.html" target="_blank"&gt;proyecto Jackrabbit&lt;/a&gt;, tengo que estudiar más en detalle la especificación Content Repository API de la &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr170/index.html" target="_blank"&gt;JSR-170&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.twitter.com/2008/07/finding-perfect-match.html" target="_blank"&gt;Twitter adquiriendo a Summize&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Y hay que visitar y usar&amp;nbsp;&lt;a href="http://www.emergingtechs.com/posts/15-online-tools-you-will-come-love-tech" target="_blank"&gt;10 herramientas para un tech&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Nuevo &lt;a href="http://blogs.msdn.com/gardel/" target="_blank"&gt;Blog de la comunidad MSDN en español&lt;/a&gt;. Gracias a &lt;a href="http://blogs.msdn.com/masaez/" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; por el aviso.&lt;/p&gt; &lt;p&gt;Si alguien necesita acá está: &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=FiniteStateMachinesPhyshunandSpring" target="_blank"&gt;Implementing Finite State Machines with Physhun and Spring&lt;/a&gt; (en Java)&lt;/p&gt; &lt;p&gt;Cada vez más lenguajes dinámicos sobre máquinas virtuales, ver &lt;a href="http://www.alittlemadness.com/2008/07/15/java-6-using-python-via-the-new-scripting-engine/" target="_blank"&gt;Java 6: Using Python via the new Scripting Engine&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Interesante código y artículo, sobre un tema que se necesita conocer: &lt;a href="http://www.codeproject.com/KB/aspnet/SingleSignon.aspx" target="_blank"&gt;Single Sign-on in ASP.NET and Other Platforms&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para entender la historia de MVC: &lt;a href="http://heim.ifi.uio.no/trygver/2003/javazone-jaoo/MVC_pattern.pdf" target="_blank"&gt;The Model-View-Controller, Its past and present&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Más sobre Model-View-Controller, Model-View-Presenter, y Presentation-Abstraction-Control en &lt;a href="http://ctrl-shift-b.blogspot.com/2007/08/interactive-application-architecture.html" target="_blank"&gt;Interactive Application Architecture Patterns&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;MVC en ASP.NET en &lt;a title="ASP.NET MVC - The Official Microsoft ASP.NET Site" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC - The Official Microsoft ASP.NET Site&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una interesante comparación de David Hayden&amp;nbsp;&lt;a href="http://www.pnpguidance.net/Post/ASPNETMVCFrameworkComparedWebClientSoftwareFactoryWCSF.aspx" target="_blank"&gt;ASP.NET MVC Framework Compared To Web Client Software Factory ( WCSF )&lt;/a&gt;&lt;/p&gt; &lt;p&gt;¿Necesitan un manejar un proyecto de software? No lo uso, vería el open source Trac Project, via web en Java (gracias a J. Franco, por este enlace). Al parecer, trabaja con &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;¿Necesitan open source en Java? De todo en &lt;a title="http://java-source.net/" href="http://java-source.net/"&gt;http://java-source.net/&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Off topic total: mi mejor post hasta ahora del 2008, con gráfica incluida, en &lt;a title="Posmopolitan" href="http://ajlopez.zoomblog.com/archivo/2008/07/08/posmopolitan.html"&gt;Posmopolitan&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;br /&gt;&lt;a title="http://friendfeed.com/ajlopez" href="http://friendfeed.com/ajlopez"&gt;http://friendfeed.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641989" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Enlaces+y+Noticias/default.aspx">Enlaces y Noticias</category></item><item><title>Libro Foundation of Programming, listo para bajar</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx</link><pubDate>Wed, 25 Jun 2008 15:48:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637596</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1637596</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx#comments</comments><description>&lt;p&gt;Gracias a Cladio M.E. Bastos Iorio de &lt;a href="http://www.blumer.com.ar"&gt;http://www.blumer.com.ar&lt;/a&gt; me entero de la aparición de este libro. Claudio posteó la información en una lista pública del MUG de Argentina (&lt;a href="http://www.mug.org.ar/"&gt;http://www.mug.org.ar/&lt;/a&gt; ):&lt;/p&gt; &lt;p&gt;&lt;a title="Foundations of Programming Ebook" href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;Foundations of Programming Ebook&lt;/a&gt;&lt;/p&gt; &lt;h6&gt;&amp;nbsp;&lt;/h6&gt; &lt;blockquote&gt; &lt;p&gt;I&amp;#39;m excitted to finally release the official, and completely free, Foundations of Programming EBook. This essentially contains all 9 Foundation parts including a conclusion and some typical book fluff (table of content, acknowledgement and so on). A number of spelling errors were corrected, along with some small technical changes and clarifications - largely based on feedback, so thanks for everyone who provided it! Otherwise it&amp;#39;s exactly the same as what&amp;#39;s been posted here over the past several months. &lt;p&gt;Download it from &lt;a href="http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx"&gt;http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx&lt;/a&gt; &lt;p&gt;&lt;img src="http://www.openmymind.net/cover.jpg" alt="" /&gt;  &lt;p&gt;If the above link fails, you can also get it from &lt;a href="http://www.openmymind.net/FoundationsOfProgramming.pdf"&gt;http://www.openmymind.net/FoundationsOfProgramming.pdf&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Acabo de leer el índice, y de leer algunos capítulos rápidamente. Es muy interesante los temas que toca, y parece bien encarados. El bueno de Karl Seguin ha hecho un magnífico trabajo, colocando en un solo libro temas que nos tocan en el desarrollo de software de todos los días. Si bien está algo orientado a .NET, es totalmente aprovechable en otras tecnologías, como Java. El texto había ido apareciendo en los últimos meses, en forma de posts, y revisado por colegas, en general dentro del movimiento ALT.NET, así que el trabajo de Seguin se ha enriquecido con los comentarios de la comunidad de desarrollo. &lt;p&gt;Sobre el autor &lt;blockquote&gt; &lt;p&gt;Karl Seguin is a developer at Fuel Industries, a former Microsoft MVP, a member of the influential CodeBetter.com community and an editor for DotNetSlackers. He has written numerous articles and is an active member of various Microsoft public newsgroups. He lives in Ottawa, Ontario Canada.  &lt;p&gt;His personal webpage is: &lt;a href="http://www.openmymind.net/"&gt;http://www.openmymind.net/&lt;/a&gt;  &lt;p&gt;His blog, along with that of a number of distinguished professionals, is located at: &lt;a href="http://www.codebetter.com/"&gt;http://www.codebetter.com/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Enumero algunos temas tratados: &lt;p&gt;- El movimiento ALT.NET, enumerando y desarrollando sus pilares, algo confrontados con la visión MSDN &lt;p&gt;- Domain-Driven Design, explicando los términos, y justamente, explicando cuándo usarlo&amp;nbsp;y cuándo no, cuál es el contraste con una aproximación Data-Centric. &lt;p&gt;- Persistencia, algo con lo que lidiamos en prácticamente cada proyecto. &lt;p&gt;- Dependency Injection, una de las mejores técnicas inventadas, desde que alguien dijo que el pan tenía que venir en rebanadas. &lt;p&gt;- Unit Testing, indispensable en el bolso de la desarrolladora y en el bolsillo del caballero desarrollador. Hay días en los que pienso que hasta el Hello World de Kernighan y Ritchie debería tener su Unit Test. &lt;p&gt;- Object Relational Mappers, todo un capítulo explicando la idea y algunas implementaciones, usando NHibernate. &lt;p&gt;- Manejo de memoria, un back to basics que veo necesario, como comento en mis cursos. &lt;p&gt;- Excepciones, otro back to basics que se debe explicar. &lt;p&gt;- Proxy, tengo que ver en detalle este capítulo, para ver hasta dónde llega la idea del autor. &lt;p&gt;El libro también viene acompañado de código, con ejemplos de los temas tratados, por ejemplo, las formas de usar NHibernate, documentando sus características. Lo pueden bajar desde: &lt;p&gt;&lt;a href="http://openmymind.net/CodeBetter.Foundations.zip"&gt;http://openmymind.net/CodeBetter.Foundations.zip&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637596" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Libros/default.aspx">Libros</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category></item><item><title>"Ver la luz" con generación de código y AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx</link><pubDate>Tue, 10 Jun 2008 14:02:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1633619</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1633619</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx#comments</comments><description>&lt;p&gt;Ayer dí una charla gratuita sobre generación de código, usando &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;. Espero haber transmitido la idea de que es más que generación de código, y que va más allá de la tecnología actual.&lt;/p&gt; &lt;p&gt;Quisiera enumerar algunos posts relacionados con el tema, y comentarlos, así como enumerar enlaces y recursos.&lt;/p&gt; &lt;h3&gt;Posts sobre generación de código&lt;/h3&gt; &lt;p&gt;&lt;a title="Sobre la generaci&amp;oacute;n de c&amp;oacute;digo" href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generación de código&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Este es el primer post a leer. Vemos ahí que el cambio de tecnología es una constante en la historia de desarrollo de software, y que no se ve en el horizonte una unificación de nada, ni de lenguajes ni de plataformas. Cada año que pasa, sabemos más de hacer sistemas, pero curiosamente, cada sistema nuevo necesita más codigo que el anterior, en general. Aún usando tecnologías que nos alivian el trabajo, por ejemplo, algún ORM (Object Relational Mapper), si la tecnología triunfa, el propio mercado nos lleva a hacer sistemas más complejos y grandes, y lo que ahorramos en código a escribir, luego lo perdemos en la mayor complejidad de lo sistemas que tenemos a nuestro alcance construir.&lt;/p&gt; &lt;p&gt;También se enumeran otras alternativas a la generación de código, y sus problemas. Las herramientas CASE son muy rígidas, o generales o abarcativas, así como UML y otras iniciativas. Lo que necesitamos son modelos específicos de nuestro dominio, y poder generar lo que querramos, de la forma que nos convenga. De ahí la necesidad de contar con un generador de código que no esté orientado a una tecnología a generar en particular, que sea de código abierto, y que genere lo que nosotros le indicamos, no lo que los autores de la herramienta quieren o pensaron inicialmente.&lt;/p&gt; &lt;p&gt;El usar frameworks propietarios, quedarse en una sola tecnología, tratar de generar todo en runtime apelando a metadata, o generar código desde XML aplicando transformaciones XSLT, son alternativas que creo que son inferiores o más complejas, como se explica en ese post.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando C&amp;oacute;digo- Hello World con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx"&gt;Generando Código- Hello World con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Esta es la &amp;quot;prueba ácida&amp;quot; de todo generador de código. Si una herramienta de ese tipo no nos ayuda a crear programas &amp;quot;Hola mundo&amp;quot;, con variantes, en distintas tecnologías, entonces no es lo bastante flexible. AjGenesis hace hincapié en la flexibilidad, la adaptibilidad a lo que Uds quieran producir, sin atarlos a una forma o metadata en particular.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando aplicaciones con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Un post algo viejo, pero que muestra cómo se pueden generar aplicaciones no triviales con esta herramienta.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="AjGenesis- Modelo generado desde los assemblies" href="http://msmvps.com/blogs/lopez/archive/2007/11/27/ajgenesis-modelo-generado-desde-los-assemblies.aspx"&gt;AjGenesis- Modelo generado desde los assemblies&lt;/a&gt;&lt;br /&gt;&lt;a title="AjGenesis- Modelo desde la Base de Datos" href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx"&gt;AjGenesis- Modelo desde la Base de Datos&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Posts sobre cómo el modelo puede partir de otras fuentes, cualquiera que Uds. vean que sea conveniente. Luego, la propia herramienta puede mejorar, completar el modelo, hacer inferencias, o Uds. mismos completarlos, por ejemplo, si el modelo de base de datos no es lo bastante rico para darnos algo de semántica sobre el sistema que tenemos entre manos.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 3)" href="http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx"&gt;Generando código para NHibernate (Parte 3)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 2)" href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Generando código para NHibernate (Parte 2)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 1)" href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Para ver que pueden usar AjGenesis para facilitar el desarrollo usando alguna librería reconocida por la comunidad, pueden leer esta serie de enlaces, donde gracias a una idea de Omar&amp;nbsp;del valle Rodríguez, se desarrollaron templates para usar NHibernate, y generar hasta una capa de presentación web para probar lo generado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Hacia el AjGenesis Recipes" href="http://msmvps.com/blogs/lopez/archive/2007/11/20/hacia-el-ajgenesis-recipes.aspx"&gt;Hacia el AjGenesis Recipes&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Es un trabajo en progreso, para incorporar interacción con el usuario durante el proceso de generación de código.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Usando AjGenesis y NAnt" href="http://msmvps.com/blogs/lopez/archive/2007/11/01/usando-ajgenesis-y-nant.aspx"&gt;Usando AjGenesis y NAnt&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Explicación y enlaces para usar AjGenesis desde NAnt. Si alguien necesita una interfaz gráfica NAnt-GUI, pueden bajarla desde &lt;a title="NAnt-GUI" href="http://groups.google.com/group/codegeneration/t/2aef426f02370d1"&gt;NAnt-GUI&lt;/a&gt;&amp;nbsp;(preparado por Carlos Marcelo Santos, del &lt;a href="http://groups.google.com/group/codegeneration" target="_blank"&gt;grupo de generación de código&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Genesis Studio- una IDE para AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/12/24/genesis-studio-una-ide-para-ajgenesis.aspx"&gt;Genesis Studio- una IDE para AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;No todo lo tienen que hacer desde la línea de comando, o desde el NAnt/NAnt-GUI. El bueno de Jonathan Cisneros desarrolló esta herramienta WinForm, con sintaxis de color y muchas mejoras en la experiencia de usuario, que pueden bajar desde:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/ajgenesisstudio" href="http://www.codeplex.com/ajgenesisstudio"&gt;http://www.codeplex.com/ajgenesisstudio&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Preservando c&amp;oacute;digo en AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/11/11/preservando-c-243-digo-en-ajgenesis.aspx"&gt;Preservando código en AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Si necesitan generar código, pero luego modificarlo, pueden usar algunas capacidades de AjGenesis para delimitar qué parte regenerar y cuales conservan.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Code Generation as a Service" href="http://msmvps.com/blogs/lopez/archive/2008/04/03/code-generation-as-a-service.aspx"&gt;Code Generation as a Service&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;La última adición al AjGenesis: ahora pueden generar código usando una interfaz web. Esto permite que&amp;nbsp;ya sea en Internet, o desde la intranet de su empresa, puedan generar código controlado, que cumpla con los estándares que se hayan adoptado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Más posts sobre AjGenesis en&lt;/p&gt; &lt;p&gt;&lt;a title="AjGenesis" href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Si necesitan pasarle información a alguien que no maneja el español, pueden probar con mis artículos en &amp;quot;Anglish&amp;quot; (Angel&amp;#39;s English):&lt;/p&gt; &lt;p&gt;&lt;a title="http://ajlopez.wordpress.com/category/ajgenesis" href="http://ajlopez.wordpress.com/category/ajgenesis"&gt;http://ajlopez.wordpress.com/category/ajgenesis&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Enlaces&lt;/h3&gt; &lt;p&gt;EL sitio sobre generación de código es&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codegeneration.net"&gt;http://www.codegeneration.net&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ahí encontraran comentarios, herramientas, preguntas frecuentes sobre generación de código en general. Tienen una base de datos de herramientas publicadas. Hay enlaces sobre generación de código para distintas tecnologías, como Java, .NET, PHP y también temas de MDA (Model-Driven Architecture).&lt;/p&gt; &lt;p&gt;Otros enlaces que tratamos en las charlas son:&lt;/p&gt; &lt;p&gt;&lt;a title="CodeSmith Tools - The best .NET template based source code" href="http://www.codesmithtools.com/"&gt;CodeSmith Tools&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="MyGeneration Software" href="http://www.mygenerationsoftware.com/"&gt;MyGeneration Software&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="AndroMDA.org - Home" href="http://www.andromda.org/"&gt;AndroMDA.org - Home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mantengo todo tipo de enlaces relativos a generación de código en&lt;/p&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/codegeneration"&gt;http://del.icio.us/ajlopez/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Lista de correo sobre generación de código&lt;/h3&gt; &lt;p&gt;Existe un Google Group que se puede consultar por email, en español, dedicado a la generación de código. Ahí, además de otros temas, se trata de generación de código con AjGenesis, la generación de templates. En los archivos del grupo se publican ejemplos armados por los miembros.&lt;/p&gt; &lt;p&gt;Pueden ver los mensajes y suscribirse, en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://groups.google.com/group/codegeneration" href="http://groups.google.com/group/codegeneration"&gt;http://groups.google.com/group/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Conclusión&lt;/h3&gt; &lt;p&gt;Espero que quede claro que lo importante es usar generación de código como solución pragmática, pero basado en la abstracción de un modelo. Hacer el ejercicio de abstracción de generar un modelo adecuado para lo que necesitemos, es un &amp;quot;must&amp;quot; que me parece el primer paso para separarnos de los problemas de cambios en las tecnologías, herramientas y plataformas.&lt;/p&gt; &lt;p&gt;Luego, el modelo debe ser de libre definición. Y el texto o código generado, también: debe ser el tipo de texto o código que hubiéramos generado nosotros mismos. Finalmente, la herramienta de generación de código tiene que estar disponible en código totalmente abierto, para que se pueda extender, entender o usar de la forma que querramos.&lt;/p&gt; &lt;p&gt;Tengo que escribir más sobre la importancia del modelo, y que pueden hacer el suyo propio: no hay modelo fijo, pueden partir desde la base de datos, desde los archivos XML de los ejemplos, o desde donde quieran. También tengo que escribir sobre la posibilidad de hacer modelos que se deriven de otros modelos. Y escribir haciendo énfasis en que lo que construimos, en realidad, es un sistema experto. De ahí, que desde el principio, incorporé un lenguaje de programación que puede tomar decisiones, completar y modificar el modelo.&lt;/p&gt; &lt;p&gt;Como ven, con AjGenesis, ¡sky is the limit! :-)&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1633619" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Seminarios gratuitos de NHibernate, en Buenos Aires</title><link>http://msmvps.com/blogs/lopez/archive/2008/01/31/seminarios-gratuitos-de-nhibernate-en-buenos-aires.aspx</link><pubDate>Thu, 31 Jan 2008 07:14:20 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1487751</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1487751</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/01/31/seminarios-gratuitos-de-nhibernate-en-buenos-aires.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.mug.org.ar/Eventos/455.jpg" align="left" alt="" /&gt; El mes de febrero, se viene interesante. El Microsoft User Group de Argentina presenta a Fabio Maulo y &lt;a href="http://darioquintana.com.ar" target="_blank"&gt;Darío Quintana&lt;/a&gt;, activos miembros del equipo de desarrollo del proyecto de código abierto NHibernate, en dos charlas, miércoles 20 y jueves 21 de Febrero, de 18:30 a 21:30hs.&lt;/p&gt; &lt;p&gt;Veremos a Fabio y Darío tratando los temas:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SEMINARIO 20/02/08 &amp;quot;NHibernate: ORM Persistence Framework&amp;quot; &lt;/strong&gt; &lt;p&gt;- Quick Start&lt;br /&gt;- Entorno de test de entities  &lt;p&gt;- Manejo de Session de NHibernate: Qué cosas hacer y qué no.&lt;br /&gt;- Parent-Child &lt;br /&gt;- Overview Lazy-Loading  &lt;p&gt;- Ejemplo de como cambiar base de datos usando los ejemplos generado&lt;br /&gt;en toda la charla.&lt;br /&gt;- Overview NHibernate.Validator  &lt;p&gt;&lt;strong&gt;SEMINARIO 21/02/08 &amp;quot;NHibernate Advanced&amp;quot; &lt;/strong&gt; &lt;p&gt;- Introducción a NHibernate&lt;br /&gt;- Manejo de Sesiones.  &lt;p&gt;- Conceptos y ejemplos: EntityName, SQL nativa para CRUD, Transformers, StoredProcedure, Named-Queries, Event-Listeners, Filters, MultiQuery, StatelessSession, UserType, UserCollectionType, Batch-size entre otros.&lt;br /&gt;- Queries: HQL, Criteria, SQL Nativo.  &lt;p&gt;- NHibernate.Shards: Estado del arte  &lt;p&gt;- Tunning  &lt;p&gt;Detalle, inscripción, datos adicionales, en la página del MUG: &lt;p&gt;&lt;a href="http://www.mug.org.ar/Eventos/2907.aspx" target="_blank"&gt;Seminarios Gratuitos de NHibernate&lt;/a&gt; &lt;p&gt;Como siempre, la referencia para consultas sobre NHibernate, en español, es: &lt;p&gt;&lt;a title="NHibernate-Hispano" href="http://groups.google.com.ar/group/NHibernate-Hispano"&gt;NHibernate-Hispano&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1487751" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Cursos/default.aspx">Cursos</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Generando código para NHibernate (Parte 3)</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx</link><pubDate>Mon, 29 Oct 2007 09:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1273179</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1273179</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx#comments</comments><description>&lt;p&gt;Siguiendo con la serie&lt;/p&gt;
&lt;p&gt;&lt;a title="Generando código para NHibernate (Parte 1)" href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando código para NHibernate (Parte 2)" href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Generando código para NHibernate (Parte 2)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;del ejemplo de Omar del valle Rodriguez, tengo una nueva versión del ejemplo, que genera aplicaciones con &lt;a href="http://www.ajlopez.com/ajgenesis"&gt;AjGenesis&lt;/a&gt;. Gracias desde acá, a las sugerencias de Omar, y de Fabio Maulo. He incorporado algunas características, como:&lt;/p&gt;
&lt;p&gt;- Uso de NHibernate 1.2&lt;/p&gt;
&lt;p&gt;- Manejo de mapeo de subclases en .hbm por separado&lt;/p&gt;
&lt;p&gt;- Propiedades virtuales en las entidades&lt;/p&gt;
&lt;p&gt;- Dos nuevas aplicaciones generadas&lt;/p&gt;
&lt;p&gt;Pueden bajar el ejemplo AjOmar Versión&amp;nbsp;1.1 (es el archivo&amp;nbsp;&lt;strong&gt;AjOmar-v1.1.zip&lt;/strong&gt;) desde la &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;página de ejemplos de AjGenesis&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;El modelo&lt;/h3&gt;
&lt;p&gt;Como siempre, la idea de AjGenesis es basarse en un modelo libre, donde uno especifica lo que le interesa modelar. En el caso de este ejemplo, se modelan entidades, y a partir de esa información se generan aplicaciones completas. El modelo prácticamente no cambió desde la anterior versión (ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;), en el archivo &lt;strong&gt;Projects/AjOmar/Project.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:59fb84c3-4ef7-4027-9ace-346977021a44" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;Example AjOmar for (N)Hibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOm&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;com.ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Model&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Client.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Company.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/User.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Model&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como había pedido Omar, &lt;strong&gt;Company&lt;/strong&gt; y &lt;strong&gt;User&lt;/strong&gt; heredan de &lt;strong&gt;Client&lt;/strong&gt;. En la base de datos se usan tres tablas, y el NHibernate hace la magia del mapeo en este dominio con entidades relacionadas por herencia.&lt;/p&gt;
&lt;p&gt;Como antes, también se especifican los elementos de tecnología, como la base de datos a usar, el usuario y contraseña a usar en los strings de conección, y otros detalles. Esto permite cambiar la tecnología, sin cambiar el modelo de arriba. Un ejemplo en el archivo &lt;strong&gt;Projects/AjOmar/Technologies/VbNet2Nh.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f6340adb-111d-42cc-93c6-c007a80600ac" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;VbNet2Nh&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Database&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;MsSql&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Username&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;sa&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Username&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajom_&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Host&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(local)&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Host&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Database&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;NHibernate.Dialect.MsSql2000Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Deberá adaptar este archivo si necesita ajustar esos datos.&lt;/p&gt;
&lt;p&gt;Siguiendo algunas recomendaciones de Fabio Maulo, ahora hay un .hbm por entidad. Ejemplo generado en &lt;strong&gt;Build/AjOmar/VbNet2Nh/Src/AjOmar.Data/Company.hbm.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:15dfc089-ece1-4b66-a5bf-9017d3ab2a93" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR:#ff00ff;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; 
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;hibernate-mapping &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    assembly&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    namespace&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;joined-subclass &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Company&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; table&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ajom_companies&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; extends&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Client&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;key &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;column&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ContactName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;joined-subclass&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;hibernate-mapping&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Las aplicaciones&lt;/h3&gt;
&lt;p&gt;Se pueden generar aplicaciones completas, con proyectos y solución web.&amp;nbsp;La generación se invoca con comando de línea, como se explica en la &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;. Hay que agregar el directorio bin del AjGenesis en el path de ejecución para que funcionen.&lt;/p&gt;
&lt;p&gt;Ahora están habilitados cuatro generaciones de soluciones:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;GenerateProject AjOmar VbNet2Nh&lt;br /&gt;GenerateProject AjOmar CSharp2Nh&lt;br /&gt;GenerateProject AjOmar VbNet2DDDNh&lt;br /&gt;GenerateProject AjOmar CSharp2DDDNh&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Los dos primeros generan aplicaciones VB.NET y C Sharp, con ASP.NET 2.x, y acceso a datos usando DAOs que usan NHibernate.&lt;/p&gt;
&lt;p&gt;Los dos nuevos comandos generan aplicaciones con VB.NET y C Sharp, que utilizan algunas ideas de Domain-Driven Design.&lt;/p&gt;
&lt;h3&gt;Generando DDD&lt;/h3&gt;
&lt;p&gt;Las nuevas soluciones generadas, tienen&amp;nbsp;varios proyectos de librerías de clases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AjNHibernate&lt;/strong&gt;: contiene las clases para el manejo de las llamadas al NHibernate, como configuración, factoría y obtención de sesiones. 
&lt;li&gt;&lt;strong&gt;AjOmar.Domain&lt;/strong&gt;: contiene las Entities, Services, y Repositories, a la Evans. No hay conceptos de Value Objects, o Aggregates. Los servicios se llaman Manager, para distinguirlos de la fachada de servicio que uso en Application. 
&lt;li&gt;&lt;strong&gt;AjOmar.Application&lt;/strong&gt;: la capa que coordina las llamadas al Dominio, desde la presentación. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar07.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Y como antes, hay una aplicación web &lt;strong&gt;AjOmar.WebClient&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar08.jpg" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Tengo que generar aplicaciones similares para Hibernate, Java, y MySql. La idea es que sirva como prueba de concepto: desde un mismo modelo, se pueden generar aplicaciones implementadas con distintas tecnologías.&lt;/p&gt;
&lt;p&gt;Habrá que estudiar e implementar el manejo de nulos, restricciones por tamaño de campo, y mejorar la apariencia de las aplicaciones generadas.&lt;/p&gt;
&lt;p&gt;Hay que mejorar (y probar) el manejo de relaciones uno a varios, o varios a uno. Lo tengo implementado en los ejemplos &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;AjGenesisExamples3&lt;/a&gt;, pero debería pasar ese código de plantillas y adaptarlo para este ejemplo.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1273179" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Generando código para NHibernate (Parte 2)</title><link>http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx</link><pubDate>Mon, 24 Sep 2007 23:12:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1213865</guid><dc:creator>lopez</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1213865</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx#comments</comments><description>&lt;p&gt;Gracias a una iniciativa del bueno de Omar del valle Rodriguez comencé a escribir un ejemplo con &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;, para generar código .NET que use NHibernate (ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx" target="_blank"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;). Ya tenía ejemplos con y sin NHibernate (ver ....) pero esta vez, Omar pidió un modelo con herencia. Pueden descargar esta primera versión como &lt;strong&gt;AjOmar-v1.0.zip&lt;/strong&gt; desde los &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;ejemplos del proyecto en Codeplex&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Usé la versión 0.5 de AjGenesis, a descargar desde&amp;nbsp;&lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7262" target="_blank"&gt;CodePlex&lt;/a&gt;. Si Ud. tiene la versión 0.4.3, debería funcionar sobre este ejemplo, pero no la he probado.&lt;/p&gt; &lt;h3&gt;El modelo&lt;/h3&gt; &lt;p&gt;Ahora tengo una primera versión de lo pedido por Omar. El &amp;quot;leit-motiv&amp;quot; del AjGenesis, es basarse en un modelo definible libremente, y desde ahí, ir generando código, scripts de base de datos, artefactos de textos, archivos de solución, proyectos, lo que uno quiera.&lt;/p&gt; &lt;p&gt;En el modelo &lt;strong&gt;Projects\AjOmar\Project.xml&lt;/strong&gt; he definido:&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1411eeac-c318-4d90-9429-aa14b7267600" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Example AjOmar for (N)Hibernate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;AjOm&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;com.ajomar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ajomar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Entities/Client.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Entities/Company.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Entities/User.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Para entender algo más sobre el modelo y la generación, ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx" target="_blank"&gt;Hello World con AjGenesis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En el modelo coloqué tres entidades: &lt;strong&gt;Client&lt;/strong&gt;, &lt;strong&gt;Company&lt;/strong&gt;, &lt;strong&gt;User&lt;/strong&gt;, que es lo que pedía Omar. En &lt;strong&gt;Client&lt;/strong&gt;, tengo:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:504e996d-f0e3-4223-b341-2d9874c6dc1e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Client Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Clients&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Clients&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;clients&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;PhysicalAddress&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactEmail&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RegisterDate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DateTime&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;datetime&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Active&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Boolean&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;bit&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Los campos son los pedidos por Omar, pero todavía con tipos y nombres SQL que elegí yo. Client es la clase madre de Company y de User. En el &lt;strong&gt;Company.xml&lt;/strong&gt; tenemos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3d054cc9-11de-42e8-b2fa-aba70fedd729" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Company&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Company Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Companies&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Company&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Companies&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;companies&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Para los que vieron anteriores ejemplos, lo nuevo es el &lt;font face="Consolas"&gt;&amp;lt;Inherits&amp;gt;Client&amp;lt;/Inherits&amp;gt;&lt;/font&gt;. Esto indica que esta entidad &amp;quot;hereda&amp;quot; de la entidad Client, en el dominio a generar. Lo mismo puse en &lt;strong&gt;User.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0342709c-d8f3-45b0-9bf1-203c19a723e5" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;User&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;User Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Users&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;User&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Users&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;users&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FirstName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;LastName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;varchar(200)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;En el subdirectorio &lt;strong&gt;Projects\AjOmar\Technologies&lt;/strong&gt;,&amp;nbsp;encontramos los archivos &lt;strong&gt;CSharp2Nh.xml&lt;/strong&gt; y &lt;strong&gt;VbNet2Nh.xml&lt;/strong&gt;. Veamos el primero:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:716719ef-5abb-471e-a2ca-2c044ddf2420" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;CSharp2Nh&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Database&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;MsSql&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Username&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;sa&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Username&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ajom_&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(local)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Database&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;NHibernate.Dialect.MsSql2000Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vean que ahí se establece el usuario y contraseña para usar contra un SQL Server. Si quieren, lo modifican acá. Sino, como alternativa, pueden luego modificar el web.config de la solución generada. El ejemplo también instala base, pero esto es opcional: genera un archivo con los scripts de creación, que Uds. puede correr en cualquier momento manualmente contra el SQL Server que elijan.&lt;/p&gt;
&lt;h3&gt;Generando el código&lt;/h3&gt;
&lt;p&gt;Para generar el código, seguir los siguientes pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Editar los parámetros del SQL Server que están en los archivos de tecnología mostrados arriba&lt;/li&gt;
&lt;li&gt;Ir a la línea de comando.&lt;/li&gt;
&lt;li&gt;Agregar al PATH el directorio &lt;strong&gt;\bin&lt;/strong&gt; del AjGenesis 0.5 bajado&lt;/li&gt;
&lt;li&gt;Ir al directorio &lt;strong&gt;AjOmar&lt;/strong&gt; del ejemplo bajado&lt;/li&gt;
&lt;li&gt;Ejecutar&lt;br /&gt;&lt;br /&gt;&lt;font face="Consolas"&gt;GenerateProject AjOmar CSharp2Nh&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;para generar el ejemplo en C Sharp 2.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajomar01.jpg" alt="" /&gt; &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Ejecutar&lt;br /&gt;&lt;br /&gt;&lt;font face="Consolas"&gt;DeployDatabase AjOmar CSharp2Nh&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;para crear la base en el SQL Server local (en caso de querer hacerlo manualmente ver el código generado para crear la base en &lt;strong&gt;Build\AjOmar\CSharp2Nh\Sql&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Si desea generar el código para VB.NET 2, ejecutar&lt;br /&gt;&lt;br /&gt;&lt;font face="Consolas"&gt;GenerateProject AjOmar VbNet2Nh&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h3&gt;La solución generada&lt;/h3&gt;
&lt;p&gt;En ambos casos, VB.NET o C Sharp, se generan directorios dentro de Build\AjOmar:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajomar02.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Si vemos el ejemplo C Sharp, queda un archivo de solución en &lt;strong&gt;Build\AjOmar\CSharp2Nh\Src&lt;/strong&gt;, que al abrirlo en el Visual Studio 2005 queda:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajomar03.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Hay varios proyectos de librerías de clases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AjNHibernate&lt;/strong&gt;: contiene las clases para el manejo de las llamadas al NHibernate, como configuración, factoría y obtención de sesiones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AjOmar.Data&lt;/strong&gt;: acá están los DAO (Data Access Objects, aunque son clases con métodos estáticos) y el .hbm de mapeo, codificado como recurso embebido en el proyecto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AjOmar.Entities&lt;/strong&gt;: las entidades del dominio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AjOmar.Services&lt;/strong&gt;: simplemente una capa de servicio delgado.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Veamos como ejemplo la entidad &lt;strong&gt;Company&lt;/strong&gt; en &lt;strong&gt;AjOmar.Entities&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:416f9c9b-8333-4c43-93dd-c6c82ed81ac7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;span style="color:#008000;"&gt;
 *    Project AjOmar
 *        Example AjOmar for (N)Hibernate
 *    Entity    Company
 *        Company Entity
 *    
 &lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjOmar.Entities {

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Company : Client {

&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;    Private Fields&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; companyName;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactName;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;    Default Constructor&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Company() {
        }

&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;    Factory Methods&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; Company Create(
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; companyname ,
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactname 
            ) {
            Company company;

            company &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Company();

            company.CompanyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; companyname;
            company.ContactName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactname;

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; company;
        }

&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;    Public Properties&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyName
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; companyName;
            }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
                companyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            }
        }

    
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ContactName
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactName;
            }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
                contactName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            }
        }


    }

}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Gracias al ejemplo inicial que me envió Omar, pude generar un .hbm con subentidades:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:48feef53-efbf-4bd9-b540-c34375b7fca4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate-mapping &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;urn:nhibernate-mapping-2.0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjOmar.Entities.Client, AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; table&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ajom_clients&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;id &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Int32&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; unsaved-value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;generator &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;native&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PhysicalAddress&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PhysicalAddress&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ContactEmail&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ContactEmail&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;RegisterDate&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DateTime&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;RegisterDate&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Active&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Boolean&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Active&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;joined-subclass &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjOmar.Entities.Company, AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; table&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ajom_companies&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ContactName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ContactName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;joined-subclass&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;joined-subclass &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjOmar.Entities.User, AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; table&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ajom_users&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;FirstName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;FirstName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;LastName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;LastName&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;255&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;joined-subclass&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate-mapping&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hay un proyecto web &lt;strong&gt;AjOmar.WebClient&lt;/strong&gt;, con una página inicial, un tema, un master page, y un directorio con páginas de navegación y actualización del modelo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajomar04.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Desde el menú de administración pueden actualizarse los datos:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajomar05.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;No es un &amp;quot;qué bruto, qué página&amp;quot;, pero algo funciona... Jeje, lo mío no es el diseño gráfico. :-)&lt;/p&gt;
&lt;p&gt;Noten que en web.config, coloqué la configuración del NHibernate:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:15a12483-fb08-416a-9f13-91855dd7001b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;nhibernate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add 
            &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;hibernate.connection.provider&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;          
            value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;NHibernate.Connection.DriverConnectionProvider&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add 
            &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;hibernate.dialect&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;                      
            value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;NHibernate.Dialect.MsSql2000Dialect&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add 
            &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;hibernate.connection.driver_class&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;          
            value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;NHibernate.Driver.SqlClientDriver&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add 
            &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;hibernate.connection.connection_string&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
            value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;server=(local);database=AjOmar;uid=sa;pwd=&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;nhibernate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;y un HttpModule para manejar la sesión:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:4486c0ea-2279-402d-b07d-b19695da2dda" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;httpModules&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
         &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjNHibernate.SessionHttpModule, AjNHibernate&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;NHSessionModule&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;httpModules&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Quedan para encarar en la próxima versión&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilizar la última versión de NHibernate (con esquema 2.2)&lt;/li&gt;
&lt;li&gt;Ver de poner los tipos SQL que pedía Omar&lt;/li&gt;
&lt;li&gt;Probar contra SQL Server 2005&lt;/li&gt;
&lt;li&gt;Ver de agregar &amp;quot;lazy&amp;quot; en las joined subclasses del mapeo&lt;/li&gt;
&lt;li&gt;Generar para VB.NET 1.x/CSharp 1.x&lt;/li&gt;
&lt;li&gt;Generar con conceptos de Domain-Driven Design (capa Presentation+Application+Domain+Infrastructure).&lt;/li&gt;
&lt;li&gt;Generar código para Java con Hibernate y MySql&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1213865" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Generando código para NHibernate (Parte 1)</title><link>http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx</link><pubDate>Sun, 05 Aug 2007 13:18:42 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1087740</guid><dc:creator>lopez</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1087740</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx#comments</comments><description>&lt;p&gt;Ya en algún &amp;quot;post&amp;quot; anterior, &lt;a title="Generando aplicaciones con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&amp;nbsp;comenté sobre cómo el proyecto &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt; genera código para distintas plataformas, incluyendo VB.Net 1/2, C# 1/2, y usando ADO.NET o NHibernate. El proyecto está basado en templates, que cualquier puede adaptar para generar como quieran los artefactos de texto que necesiten, en cualquier tecnología. AjGenesis está escrito en VB.Net, y es un proyecto de código abierto.&lt;/p&gt; &lt;p&gt;Gracias a la lectura de otro &amp;quot;post&amp;quot;, &lt;a title="Sobre la generaci&amp;oacute;n de c&amp;oacute;digo" href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generación de código&lt;/a&gt;, surgió una iniciativa de Omar del valle Rodríguez, para generar un modelo que le interesa, en NHibernate. Pueden ver el thread original en la excelente lista de arquitectura del &lt;a href="http://www.mug.org.ar"&gt;Microsoft User Group de Argentina&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.mail-archive.com/arquitectura@mug.org.ar/msg00349.html" href="http://www.mail-archive.com/arquitectura@mug.org.ar/msg00349.html"&gt;http://www.mail-archive.com/arquitectura@mug.org.ar/msg00349.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(me temo que no quedaron aún publicadas las respuestas al mensajes, entre ellas la propuesta del bueno de Omar).&lt;/p&gt; &lt;p&gt;La idea de Omar es implementar, según sus propias palabras:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;quot;Una empresa, cuyos clientes pueden ser personas o empresas, los clientes se deben tratar como tal, independientemente de si es persona o empresa, pero deberíamos poder identificar a cada uno por separado..&lt;/em&gt; &lt;p&gt;&lt;em&gt;En el resultado que espero siempre veo que se genere: 3 tablas, cliente, persona y empresa, con una relación uno a uno entre ellas partiendo de cliente.. y en el modelo sería un objeto cliente del cual heredan persona y empresa.&amp;quot;&lt;/em&gt; &lt;p&gt;Bien, interesante modelo. Me llevará a implementar por primera vez, en mis modelos (recuerden que el modelo del AjGenesis ES LIBRE, cualquiera puede armar el modelo que quiera), entidades con generalización. Aquí Cliente será la generalización de Persona y Empresa. Según lo pedido por Omar, habrá tres tablas: una donde estan los datos de todos los Clientes, otra donde estarán los datos adicionales de una Persona, y otra para los datos específicos de Empresa. &lt;p&gt;Luego, en la discusión del tema, llegamos a tener como objetivo a generar, de nuevo, en palabras de Omar: &lt;p&gt;&lt;em&gt;1- Client.hbm.xml (archivo de mapeo para NH)&lt;br /&gt;2- Client.cs (entidad en C# que describe un cliente)&lt;br /&gt;3- User.cs (entidad en C# que describe un cliente de tipo &amp;quot;persona&amp;quot;)&lt;br /&gt;4- Company.cs (entidad en C# que describe un cliente de tipo &amp;quot;empresa&amp;quot;)&lt;br /&gt;5- ClientFactory.cs (Factory que me permite manipular una entidad Cliente [Insert, Update, Delete, GetAll, GetByID, GetAllCompany, etc, etc])&lt;br /&gt;6- Client.sql (script para SQL Server con el código de las tablas a incluir)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Además, podríamos generar el código para VB.Net, y algunas páginas ASP.NET para navegar y actualizar las entidades del modelo, como hacen los anteriores ejemplos de AjGenesis. Omar proveerá una implementación destino, y armaremos el modelo, los templates y tareas en AjGenesis, para producir esos archivos y algo más.&lt;/p&gt; &lt;p&gt;El problema está planteado. Veremos cómo progresa, en nuevos artículos.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1087740" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Recursos sobre Hibernate</title><link>http://msmvps.com/blogs/lopez/archive/2007/07/20/recursos-sobre-hibernate.aspx</link><pubDate>Fri, 20 Jul 2007 10:42:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1042701</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1042701</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/07/20/recursos-sobre-hibernate.aspx#comments</comments><description>&lt;p&gt;En varios de los ejemplos que vemos en mis cursos de Java, terminamos usando &lt;a href="http://www.hibernate.org" target="_blank"&gt;Hibernate&lt;/a&gt;, la librería de ORM (Object Relational Mapping) para Java. Es realmente muy útil para armar un modelo de dominio con relaciones entre objetos, y manejar su persistencia de una forma bastante transparente. Ya escribiré sobre generar código desde &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt; para Hibernate (así como para &lt;a href="http://www.nhibernate.org" target="_blank"&gt;NHibernate&lt;/a&gt;, algo adelanté en &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx" target="_blank"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Mientras, hay varias páginas con recursos, tutoriales y ejemplos de uso de Hibernate. Una de las más abarcativas es:&lt;/p&gt; &lt;p&gt;&lt;a href="http://tssblog.techtarget.com/index.php/interoperability/mini-guide-hibernate-and-nhibernate" target="_blank"&gt;Mini-guide: Hibernate and NHibernate&lt;/a&gt;&lt;/p&gt; &lt;p&gt;aunque por ahora es en su mayoría sólo sobre Hibernate.&lt;/p&gt; &lt;p&gt;Algunos enlaces más:&lt;/p&gt; &lt;p&gt;&lt;a href="http://hibernate.javabeat.net/resources/index.php?examType=HIBERNATE&amp;amp;source=MSG&amp;amp;msgId=228"&gt;Hibernate vs. Spring&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hibernate.javabeat.net/resources/index.php?examType=HIBERNATE&amp;amp;source=MSG&amp;amp;msgId=29"&gt;Developing J2EE Applications Using Hibernate Annotations and Spring MVC&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hibernate.javabeat.net/resources/index.php?examType=HIBERNATE&amp;amp;source=MSG&amp;amp;msgId=28"&gt;Object Generation: A Better Approach to Hibernate Integration&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hibernate.javabeat.net/resources/index.php?examType=HIBERNATE&amp;amp;source=MSG&amp;amp;msgId=27"&gt;Using Spring with JDO and Hibernate&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hibernate.javabeat.net/resources/index.php?examType=HIBERNATE&amp;amp;source=MSG&amp;amp;msgId=26"&gt;Bridge the gap between Struts and Hibernate&lt;/a&gt; &lt;p&gt;&lt;a href="http://hibernate.javabeat.net/tutorials/"&gt;Complete Hibernate 3.0 Tutorial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.java2s.com/Code/Java/Hibernate/CatalogHibernate.htm"&gt;Hibernate Examples&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/blogs/showblog.tss?id=Hibernate3_JDBC"&gt;Using Hibernate as a JDBC&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Más enlaces en&lt;/p&gt; &lt;p&gt;&lt;a title="http://del.icio.us/ajlopez/hibernate" href="http://del.icio.us/ajlopez/hibernate"&gt;http://del.icio.us/ajlopez/hibernate&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://del.icio.us/ajlopez/orm" href="http://del.icio.us/ajlopez/orm"&gt;http://del.icio.us/ajlopez/orm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://del.icio.us/ajlopez/nhibernate" href="http://del.icio.us/ajlopez/nhibernate"&gt;http://del.icio.us/ajlopez/nhibernate&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1042701" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Hibernate/default.aspx">Hibernate</category></item></channel></rss>