2009-08-28 6 views
9

Ich bin derzeit die hilo id Generator für meine Klassen haben aber nur die minimal von Einstellungen wurden zB mitNHibernate HiLo - neue Spalte pro Einheit und HiLo fängt


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

Aber sollte ich wirklich ein neues werden Angabe Spalte für NHibernate, um foreach entity zu verwenden und es mit einem max lo zu versehen?


<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> 
... 

Auch habe ich bemerkt, dass, wenn ich das über dem Schema tun alle Spalten nicht erstellen - nur classB_nexthi, gibt es etwas, was ich falsch mache.

+0

auf diesem ein Nicht sicher, so dass nur ein Kommentar. Versuchen Sie, den gleichen Spaltennamen dort zu behalten und zu sehen, was passiert. Ich denke NH wird für jede Tabelle eine eigene Zeile erstellen. Nochmal - nicht sicher ... – Rashack

+0

meinst du für ClassA ... aCol .... und für ClassB < Parameter Name = "Spalte"> aCol. Wenn dem so wäre, würde ich jetzt keine Spalte für den hohen Wert pro Entität haben? – Gareth

Antwort

2

fragte ich diese Frage wieder, aber in der nhusers Gruppe finden Sie hier für response i

bekam
+0

ähm ... okay danke für deine Hilfe, Fabio –

1

Wie Sie dieses Problem lösen haben? Ich implementiere deinen eigenen Widget?

Ich habe und vielleicht ein bisschen schmutzig für den Moment, aber trotzdem:

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

    } 
Verwandte Themen