2009-08-28 19 views
9

Attualmente sto usando il generatore di Hilo id per le mie classi, ma è stato semplicemente utilizzando il minimo di impostazioni per esempioNHibernate Hilo - nuova colonna per entità e HiLo cattura


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

Ma dovrei davvero essere specificando un nuovo colonna per NHibernate per utilizzare l'entità foreach e fornendola con un massimo 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> 
... 

Inoltre ho notato che quando faccio la di sopra del SchemaExport non creerà tutte le colonne - solo classB_nexthi, c'è qualcos'altro che sto facendo male.

+0

Non sono sicuro su questo, in modo che solo un commento. Prova a mantenere lo stesso nome della colonna lì e vedere cosa succede. Penso che NH creerà una riga separata per ogni tabella. Ancora: non sono sicuro ... – Rashack

+0

intendi per ClassA ... aCol .... e per ClassB < param name = "column"> aCol. Se così fosse, non significherei che ora NON avrei una colonna per il valore hi per entità? – Gareth

risposta

2

Ho fatto questa domanda di nuovo, ma nel gruppo nhusers, vedi qui per response ho ottenuto

+0

ehm ... ok grazie per il vostro aiuto, Fabio –

1

Come hai fatto a risolvere questo problema? La mia implementazione del tuo idgenerator?

ho fatto e forse un po 'sporca, per il momento, ma in ogni caso:

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() }; 
     } 

    } 
Problemi correlati