2009-08-28 22 views
9

मैं वर्तमान में मेरे कक्षाओं के लिए हिलो आईडी जनरेटर का उपयोग कर रहा है लेकिन सिर्फ उपयोग किया गया है सेटिंग के न्यूनतम जैसेNHibernate हिलो - इकाई और हिलो प्रति नया स्तंभ पकड़ता


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

लेकिन मैं वास्तव में एक नया निर्दिष्ट करने दिया जाना चाहिए NHibernate के लिए कॉलम फोरैच इकाई का उपयोग करने और इसे अधिकतम लो प्रदान करने के लिए कॉलम?


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

भी मैंने देखा है कि जब मैं SchemaExport ऊपर सभी स्तंभों का निर्माण नहीं होगा - केवल classB_nexthi, वहाँ किसी और मैं गलत कर रहा हूँ कुछ है।

+0

सुनिश्चित नहीं हैं, इसलिए केवल एक टिप्पणी। वहां एक ही कॉलम नाम रखने का प्रयास करें और देखें कि क्या होता है। मुझे लगता है कि एनएच प्रत्येक तालिका के लिए एक अलग पंक्ति तैयार करेगा। दोबारा - सुनिश्चित नहीं है ... – Rashack

+0

क्या आप कक्षा के लिए मतलब है ... <जनरेटर वर्ग = "हिलो"> aCol .... और कक्षाबी <जनरेटर वर्ग = "हिलो">< param name = "column"> aCol। यदि ऐसा नहीं है तो इसका मतलब यह नहीं होगा कि अब प्रति इकाई उच्च मूल्य के लिए कोई कॉलम नहीं होगा? – Gareth

उत्तर

2

मैं फिर से इस प्रश्न पूछा लेकिन nhusers समूह में, response के लिए यहाँ देख मैं

+0

एर ... ठीक है आपकी मदद के लिए धन्यवाद, Fabio –

1

आप इस कैसे हल किया है? मेरा अपना अभिसरण करने वाला मेरा कार्यान्वयन?

मैंने किया था और हो सकता है एक छोटा सा पल लेकिन वैसे भी के लिए गंदा: इस पर

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

    } 
संबंधित मुद्दे