2010-11-03 8 views
24

Obtengo esto cada vez que intento CREAR una entidad en particular ... solo quiero saber cómo debo averiguar la causa.Cómo resolver "La actualización por lotes ha devuelto el recuento inesperado de filas a partir de la actualización; recuento real de filas: 0; esperado: 1" ¿problema?

Uso la automatización fluida de NHibernate, por lo que quizás no haya establecido una convención de forma apropiada y/o necesite anular algunas en uno o más archivos de asignación. He ido a través de una serie de publicaciones en la web sobre este problema y tengo dificultades para averiguar exactamente por qué está sucediendo en mi caso.

El objeto que estoy guardando es bastante simple. Es un objeto "Persona" que hace referencia a una entidad "Empresa" y tiene una colección de entidades "Dirección". Las ACTUALIZACIONES funcionan bien en los objetos Person existentes que ya están en la base de datos.

Sugerencias? significa

Gracias -wg

Respuesta

25

El error que se está ejecutando la instrucción INSERT de SQL, pero el ROWCOUNT siendo devuelto por SQL Server después de que se ejecuta es 0, no 1 como se esperaba.

Existen varias causas, desde asignaciones incorrectas, hasta activadores UPDATE/INSERT que tienen cuenta de filas desactivada.

Lo mejor es perfilar las declaraciones SQL y ver qué pasa. Para hacerlo, active nHibernate sql logging, o use el generador de perfiles sql. Una vez que tenga el SQL, puede conocer la causa, si no, intente ejecutar el SQL manualmente y vea qué sucede.

También le sugiero que publique su mapeo, ya que ayudará a las personas a detectar cualquier problema.

+1

Yup. En mi caso, estoy usando el marco SharpArchitecture que predetermina los valores no guardados para el campo "Id" a cero ... en lugar de -1 como he estado acostumbrado a usar durante años. Traté de sobreescribir esto en mi configuración de automatización e incluso en una clase de mapeo personalizada ... pero todavía lo establece en 0. – wgpubs

+1

Así que probé esto: Id (a => a.Id) .UnsavedValue (0); Si todavía tiene problemas y quiere que lo eche un vistazo, agregue el SQL resultante y su mapeo a su pregunta. – Iain

+1

tuve este problema porque se estaba agregando un objeto nulo a una colección y luego se estaba realizando un guardado. – m4tt1mus

9

Esto puede suceder cuando los disparadores ejecutan consultas adicionales de DML (modificación de datos) que afectan los recuentos de filas. Mi solución fue agregar lo siguiente en la parte superior de mi gatillo:

SET NOCOUNT ON; 
0

Esto puede ocurrir debido a la tecla principal de incremento automático. Para resolver este problema, no inserte el valor de incremento automático con el conjunto de datos. Inserta datos sin la clave principal.

0

Al seleccionar una vista con un activador INSTEAD OF, puede ser casi imposible obtener el recuento de filas correcto. Después de profundizar un poco en la fuente, descubrí que puedes crear una persistencia personalizada que hace que NHibernate ignore las comprobaciones de conteo.

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister 
{ 
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) 
     : base(persistentClass, cache, factory, mapping) 
    { 
     for (int i = 0; i < this.insertResultCheckStyles.Length; i++) 
     { 
      this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.updateResultCheckStyles.Length; i++) 
     { 
      this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.deleteResultCheckStyles.Length; i++) 
     { 
      this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 
    } 
} 
+0

Hola, ¿podría decirme cómo utiliza esta persistencia? –

Cuestiones relacionadas