2009-08-28 16 views
9

Actualmente estoy usando el generador alto Identificación para mis clases, pero sólo he estado utilizando el mínimo de ajustes por ejemploNHibernate Hilo - nueva columna por entidad e Hilo atrapa


<class name="ClassA"> 
    <id name="Id" column="id" unsaved-value="0"> 
     <generator class="hilo" /> 
    </id> 
... 
 

Pero debería ser realmente especificar un nuevo columna para NHibernate para usar foreach entidad y proporcionarle un máximo lo?


<class name="ClassA"> 
    <id name="Id" column="id" unsaved-value="0"> 
     <generator class="hilo"> 
     <param name="table">hibernate_unique_key</param> 
     <param name="column">classA_nexthi</param> 
     <param name="max_lo">20</param> 
     </generator> 
    </id> 
... 
<class name="ClassB"> 
    <id name="Id" column="id" unsaved-value="0"> 
     <generator class="hilo"> 
     <param name="table">hibernate_unique_key</param> 
     <param name="column">classB_nexthi</param> 
     <param name="max_lo">20</param> 
     </generator> 
    </id> 
... 

También he notado que cuando hago lo anterior, el SchemaExport no creará todas las columnas - solamente classB_nexthi, ¿hay algo más que estoy haciendo mal.

+0

No estoy seguro en este caso, por lo que sólo un comentario. Intente mantener el mismo nombre de columna allí y vea qué sucede. Creo que NH creará una fila separada para cada mesa. De nuevo, no estoy seguro ... – Rashack

+0

¿Quiere decir para ClassA ... aCol ... y para ClassB < param name = "column"> aCol. Si es así, ¿no significaría que ahora NO tendré una columna para el valor de hi por entidad? – Gareth

Respuesta

2

hice esta pregunta de nuevo, pero en el grupo nhusers, ver aquí para response tengo

+0

er ... bien gracias por su ayuda, Fabio –

1

¿Cómo resolver esto? ¿Estoy implementando tu propio idgenerator?

lo hice y tal vez un poco sucia por el momento, pero de todos modos:

public class TableHiLoGeneratorWithMultipleColumns : NHibernate.Id.TableHiLoGenerator 
    { 
     static HashSet<string> tables = new HashSet<string>(); 
     public override void Configure(IType type, IDictionary<string, string> parms, Dialect dialect) 
     { 
      string table; 
      if (parms.ContainsKey("target_table")) 
      { 
       table = parms["target_table"]; 
       tables.Add(table); 
       parms["column"] = string.Format("{0}_{1}", DefaultColumnName, table); 
      } 
      base.Configure(type, parms, dialect); 
     } 

     public override string[] SqlCreateStrings(Dialect dialect) 
     { 
      string createTableTemplate = "create table " + DefaultTableName + "({0})"; 

      string insertInitialValuesTemplate = "insert into " + DefaultTableName + "({0})" + " values ({1})"; 

      StringBuilder createTables = new StringBuilder(); 
      StringBuilder columns = new StringBuilder(); 
      StringBuilder inserts = new StringBuilder(); 
      StringBuilder initialInsert = new StringBuilder(); 
      StringBuilder insertsValues = new StringBuilder(); 
      foreach (string table in tables) 
      { 
       columns.AppendFormat("{0}_{1} {2},", DefaultColumnName, table, dialect.GetTypeName(columnSqlType)); 
       inserts.AppendFormat("{0}_{1},", DefaultColumnName, table); 
       insertsValues.Append("1, "); 
      } 
      columns.Remove(columns.Length - 1, 1); 
      inserts.Remove(inserts.Length - 1, 1); 
      createTables.AppendFormat(createTableTemplate, columns); 
      insertsValues.Remove(insertsValues.Length - 2, 2); 
      initialInsert.AppendFormat(insertInitialValuesTemplate, inserts, insertsValues); 

      return new[] { createTables.ToString(), initialInsert.ToString() }; 
     } 

    } 
Cuestiones relacionadas