2009-08-28 42 views
9

我目前使用我的課希洛ID生成,但剛用最小的設置如NHibernate的希洛 - 每個實體和高住低練新列捕捉


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

但要我真的被指定新NHibernate使用foreach實體併爲其提供最大值的列?


<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

不知道在這一個,所以只有一個評論。嘗試保留相同的列名稱,看看會發生什麼。我認爲NH會爲每個表格創建一個單獨的行。再次 - 不知道... – Rashack 2009-08-28 08:48:17

+0

您的意思是對於ClassA ... aCol ....和ClassB < param name =「column」> aCol。如果是這樣,那麼這意味着我現在不會有每個實體的hi值的列? – Gareth 2009-08-28 10:05:35

回答

2

,我再次問到這個問題,但nhusers組中,在這裏看到response我得到

+0

呃...好的,謝謝你的幫助,法比奧 – 2012-01-19 05:36:54

1

你是怎麼解決這個問題?我執行你自己的idgenerator?

我做了,也許一點點髒的時刻,但無論如何:

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

    }