2009-08-28 10 views
9

obecnie używam generatora hilo identyfikator dla moich klas, ale właśnie zostały przy użyciu minimalna ustawień npNHibernate HiLo - nowa kolumna na podmiot i HiLo łapie


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

Ale muszę być naprawdę określając nowy kolumna dla NHibernate do użycia elementu foreach i dostarczenia mu max 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> 
... 

Również zauważyłem, że kiedy robię powyższego SchemaExport nie utworzy wszystkie kolumny - tylko classB_nexthi, czy jest jeszcze coś robię źle.

+0

Nie wiesz na ten jeden, więc tylko komentarz. Spróbuj zachować tę samą nazwę kolumny i zobacz, co się stanie. Myślę, że NH utworzy osobny wiersz dla każdej tabeli. Znowu - nie jestem pewien ... – Rashack

+0

masz na myśli dla klasy A ... aCol .... a dla klasy B < nazwa parametru = "kolumna"> aCol. Jeśli tak, to nie oznaczałoby to, że NIE posiadałbym teraz kolumny dla wartości hi na jednostkę? – Gareth

Odpowiedz

2

Poprosiłem to pytanie ponownie, ale w grupie nhusers, patrz tutaj response mam

+0

er ... ok dzięki za twoją pomoc, Fabio –

1

Jak rozwiązać ten problem? Moje wdrażanie własnego idgeneratora?

zrobiłem i może trochę brudny na chwilę ale i tak:

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

    } 
Powiązane problemy