Ha cercato un sacco ma non è stato disponibile nulla di specifico, infine è stato fatto un passo sulla riga del generatore NHibernate e trovato la seguente soluzione. Questo non è facile ma ha ancora un problema.
- Creare un nuovo classs
SqlInterceptor
che implementa IInterceptor
- Nel metodo
OnPrepareStatement
è possibile modificare l'SQL come si desidera
- Quindi aggiungere questo SqlInterceptor a Sesion se
configuration.SetInterceptor(new SqlInterceptor());
seguito è il codice per SqlInterceptor
using System;
using System.Collections;
using NHibernate.SqlCommand;
using NHibernate.Type;
namespace NHibernate
{
[Serializable]
public class SqlInterceptor : IInterceptor
{
public virtual void OnDelete(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
}
public void OnCollectionRecreate(object collection, object key)
{
}
public void OnCollectionRemove(object collection, object key)
{
}
public void OnCollectionUpdate(object collection, object key)
{
}
public virtual bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState,
string[] propertyNames, IType[] types)
{
return false;
}
public virtual bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
return false;
}
public virtual bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
return false;
}
public virtual void PostFlush(ICollection entities)
{
}
public virtual void PreFlush(ICollection entitites)
{
}
public virtual bool? IsTransient(object entity)
{
return null;
}
public virtual object Instantiate(string clazz, EntityMode entityMode, object id)
{
return null;
}
public string GetEntityName(object entity)
{
return null;
}
public object GetEntity(string entityName, object id)
{
return null;
}
public virtual int[] FindDirty(object entity, object id, object[] currentState, object[] previousState,
string[] propertyNames, IType[] types)
{
return null;
}
public virtual void AfterTransactionBegin(ITransaction tx)
{
}
public virtual void BeforeTransactionCompletion(ITransaction tx)
{
}
public virtual void AfterTransactionCompletion(ITransaction tx)
{
}
public virtual void SetSession(ISession session)
{
}
public SqlString OnPrepareStatement(SqlString sql)
{
///Do something fancy here like
///sql.Replace("_MonTranTable_", MonthName + "Tran");
return sql;
}
}
}
fonte
2009-02-07 11:57:09
no. no. no. Lo schema del tuo DB è sbagliato. Non farlo ai tavoli. non c'è una buona ragione per cui (per farlo), mai. Aggiungi in una colonna della data che memorizza la data della transazione. Se sei preoccupato per il clustering/partizionamento - la colonna della data diventa il punto di pivot. – jim
Grazie Jim per la preoccupazione. Ma come ho detto questo è un database legacy e non posso cambiarlo ora come è nella pubblicità di produzione utilizzata da almeno 400 dei miei clienti. –
Quale DB? In teoria è possibile passare a una singola tabella partizionata con una colonna della data e quindi creare viste per ogni tabella di un mese e questo risolverà il problema di ibernazione e altri problemi. – jim