2012-03-14 3 views
0

通常は、C#(流暢な休止状態)で休止状態になっていますID.(x=>x.Column).Generatedby.Sequence("blabla");流暢な休止状態 - クエリ結果によって生成されましたか?

"generated by query"のようにすることは可能でしょうか?私は、クエリまたはストアドプロシージャを指定して結果をシーケンスで取得できることを意味しますか?

ので、私はこれを実行する必要があります。私のIDvarcharある

"generatedby.sequence("sequence"); "で生成すると、整数型に関するエラーが表示されますが、もちろん正しいです。

私はこれを解決する関数を書いた。ここで私はvarchar (xxx0001,xxxx0002.......)というID値のプロセスを自動インクリメントします。それはちょうどいい仕事です。

私はその結果(関数の)をマップされたクラスのIDに割り当てる必要があります。

これを行う方法はありますか? "SELECT GenerateSequencesAccountsr('SEQ_TEST',1) AS NextValue FROM dual"の結果を私の "Id(x => x.account)?????

私はすでに挿入する前にクエリを呼び出す可能性があると考えていましたが、私の "ベース" 総ジェネリック好き:。

 public virtual void SaveData(object cls) 
     { 
      using (var session = SessionFactory.OpenSession()) 
      { 
       using (var tx = session.BeginTransaction()) 
       { 

        session.SaveOrUpdate(cls); 
        tx.Commit(); 
       } 
      } 
     } 

を任意のアイデア

答えて

0
class MyCustomSqlGenerator : IPersistentIdentifierGenerator 
{ 
    private SqlString _sql = new SqlString("your select here"); 

    public string GeneratorKey() 
    { 
     return _sql.ToString(); 
    } 

    public string[] SqlCreateStrings(Dialect dialect) 
    { 
     // TODO: return sql Create of sqlfunction 
    } 

    public string[] SqlDropString(Dialect dialect) 
    { 
     // TODO: return sql DROP of sqlfunction 
    } 

    public object Generate(ISessionImplementor session, object obj) 
    { 
     try 
     { 
      IDbCommand cmd = session.Batcher.PrepareCommand(CommandType.Text, _sql, SqlTypeFactory.NoTypes); 
      IDataReader reader = null; 
      try 
      { 
       reader = session.Batcher.ExecuteReader(cmd); 
       try 
       { 
        reader.Read(); 
        object result = IdentifierGeneratorFactory.Get(reader, NHibernateUtil.String, session); 
        return result; 
       } 
       finally 
       { 
        reader.Close(); 
       } 
      } 
      finally 
      { 
       session.Batcher.CloseCommand(cmd, reader); 
      } 
     } 
     catch (DbException sqle) 
     { 
      throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "could not get next sequence value"); 
     } 
    } 
}