Red de conocimiento informático - Material del sitio web - Cómo agregar NOLOCK en NHibernate

Cómo agregar NOLOCK en NHibernate

1. Para NHibernate 2.1, utilice createCriteria close. Session.CreateCriteria(...) .SetLockMode(LockMode.None).List();

2. SetLockMode(LockMode.None) o Connection.isolation ReadUncomitted no agregarán NOLOCK a la consulta. Ayende ingresó la respuesta correcta en su blog: Si usas puedes hacer lo siguiente:

class=" Persona"/>

SELECCIONE {persona.*}

DE Personas {persona}CON(nolock)

DONDE { persona }.Nombre LIKE :nombre

Tenga en cuenta que WTIH(nolock) se agregará a FROM

3. Hágalo de modo que pueda agregar NOLOCK (o cualquier otra sugerencia de consulta) en ICriteria o HQL sin tener que insistir en traducir el conocimiento de la consulta en un mapa o configuración de fábrica para la sesión. Estoy escribiendo este artículo para NHibernate 2.1. No sé si estos errores se han solucionado en NH 3, pero intente obtener actualizaciones en NHibernate: El error en NH 3.3 aún no se ha descubierto y las técnicas y soluciones que describo aquí todavía funcionan. Primero, cree un interceptor de la siguiente manera: [Serializable]

clase pública QueryHintInterceptor: EmptyInterceptor

{

cadena const interna QUERY_HINT_ NOLOCK_COMMENT = "queryhint- nolock: " ;

///

/// Obtiene un comentario para agregar a la consulta SQL para indicarle a este interceptor que agregue 'OPCIÓN (SUGERENCIA DE TABLA) a la consulta (alias_tabla , ÍNDICE = nombre_índice))'.

///

Cadena estática interna GetQueryHintNoLock(String tableName)

{

Devuelve QUERY_HINT_NOLOCK_COMMENT + tableName;

}

anulación pública SqlString OnPrepareStatement (SqlString sql)

{

if (sql.ToString(.Contains)). ).Contains(QUERY_HINT_NOLOCK_COMMENT))

{

sql = ApplyQueryHintNoLock(sql, sql .ToString());

}

return base.OnPrepareStatement(sql);

}

SqlString estático privado ApplyQueryHintNoLock(SqlString sql, string sqlString)

{

var indexOfTableName = sqlString.IndexOf(QUERY_HINT_NOLOCK_COMMENT) + QUERY_HINT_NOLOCK_COMMENT.Length;

Si (indexOfTableName < 0)

arroja una nueva InvalidOperationException(

"Solicitud de consulta El comentario debe contener el nombre de la tabla de la siguiente manera: '/*comentario de sugerencia de consulta'): '/* queryhint-nolock: tableName */'");

var indexOfTableNameEnd = sqlString.IndexOf(" ", indexOfTableName + 1);

if ( indexOfTableNameEnd < 0)

throw new InvalidOperationException(

"El comentario de sugerencia de consulta debe contener el nombre de la tabla, como este:' /* queryhint-nlock: tableName */'");

var tableName = sqlString.Substring(indexOfTableName, indexOfTableNameEnd - indexOfTableName).Trim ();

var regex = new Regex (@ "{0}\s(\w+)".F(tableName));

var aliasMatches = regex.Matches(sqlString, indexOfTableNameEnd);

if (aliasMatches. Count = = 0)

throw new InvalidOperationException("No se pudieron encontrar alias para la tabla con nombre: " + tableName);

var q =

foreach ( Coincidir alias Coincidir en ali

asMatches)

{

var alias = aliasMatch.Groups[1].Value;

var aliasIndex = aliasMatch.Groups[1].Index + aliasMatch. Grupos[1].Valor;