Cómo agregar NOLOCK en NHibernate
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
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;