2009-08-28 17 views
9

Tôi hiện đang sử dụng máy phát điện Hilo id cho các lớp học của tôi, nhưng vừa được sử dụng tối thiểu các thiết lập EGNHibernate HiLo - cột mới mỗi thực thể và HiLo bắt


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

Nhưng nên tôi thực sự được quy định cụ thể một mới cột cho NHibernate để sử dụng thực thể foreach và cung cấp nó với một lo tối đa?


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

Ngoài ra tôi đã nhận thấy rằng khi tôi làm các việc trên các SchemaExport sẽ không tạo ra tất cả các cột - chỉ classB_nexthi, là có cái gì khác tôi đang làm sai.

+0

Không chắc một ngày này, do đó, chỉ nhận xét. Hãy thử giữ cùng tên cột ở đó và xem điều gì xảy ra. Tôi nghĩ NH sẽ tạo ra một hàng riêng biệt cho mỗi bảng. Một lần nữa - không chắc chắn ... – Rashack

+0

bạn có ý nghĩa đối với ClassA ... aCol .... và cho ClassB < tên thông số = "cột"> aCol. Nếu vậy thì điều đó có nghĩa là tôi sẽ KHÔNG có một cột cho giá trị hi cho mỗi thực thể? – Gareth

Trả lời

2

Tôi hỏi câu hỏi này một lần nữa nhưng trong nhóm nhusers, xem ở đây để response tôi đã nhận

+0

er ... okay cảm ơn sự giúp đỡ của bạn, Fabio –

1

Làm sao bạn giải quyết này? Tôi đang triển khai idgenerator của riêng bạn?

tôi đã làm và có lẽ một chút bẩn cho khoảnh khắc nhưng dù sao:

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

    } 
Các vấn đề liên quan