Se buscó mucho pero no se encontró nada específico, finalmente se avanzó línea por línea a través de la fuente NHibernate y se encontró la siguiente solución. Esto no es fácil, pero aún tiene una solución alternativa.
- Crear un nuevo classs
SqlInterceptor
que implementa IInterceptor
- En el método
OnPrepareStatement
puede cambiar el SQL como desea
- A continuación, añadir esta SqlInterceptor a sesionará aunque
configuration.SetInterceptor(new SqlInterceptor());
siguiente es el código para 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;
}
}
}
no. no. no. Su esquema de base de datos está mal. No hagas eso a las tablas. no hay una buena razón para (hacer eso), nunca. Agregue una columna de fecha que almacena la fecha de la transacción. Si le preocupa la agrupación/partición, la columna de fecha se convierte en el punto de pivote. – jim
Gracias Jim por la preocupación. Pero como mencioné, esta es una base de datos heredada y no puedo cambiarla ahora, ya que está en anuncios de producción utilizados por al menos 400 de mis clientes. –
¿Qué DB? En teoría, puede pasar a una única tabla particionada con una columna de fecha y luego crear vistas para cada tabla de mes y medio y eso resolverá el problema de hibernación y otros problemas. – jim