2010-01-18 23 views
6

Recientemente recibí un informe de error de un cliente y no tengo suerte para resolverlo. Espero que alguien me pueda dar una idea de lo que puede estar mal.Error al eliminar un registro utilizando Linq2SQL

El error parece bastante simple:

Csla.DataPortalException: DataPortal.Delete falló (System.InvalidOperationException: Secuencia contiene más de un elemento a System.Linq.Enumerable.SingleOrDefault [TSource] (fuente IEnumerable`1)

Aquí es mi método DataPortal_Delete, que toma la fileid (PK) como parámetro.

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

lo primero que compruebo era ver si había otro registro con el mismo fileid (a pesar de ser la prima clave, esto debería ser imposible). Todos los FileIds eran de hecho únicos. Lancé la aplicación que se conectaba a la base de datos del cliente e intenté eliminar el registro y funcionó sin problemas. El técnico de TI en el sitio del cliente usó el "Registrador de pasos del problema" para enviarme capturas de pantalla paso a paso de las acciones realizadas por el usuario. Nada fuera de lo común, y cuando usaba una máquina diferente, podía eliminar el registro sin ningún error. Al parecer, esto solo ocurre cuando la aplicación se ejecuta en Windows 7.

Dicho esto, ¿hay alguna idea de qué podría estar causando esto?

+0

Files.FileId es la clave principal de esa tabla? –

+0

¿Está seguro de que este fragmento de código genera el error? El error hace referencia a SingleOrDefault, pero la función está utilizando Single. – gfrizzle

+0

¿Son los FileSources nulos? Si estos son objetos diferentes, ¿no tiene que usar un include para obtenerlos antes de poder eliminarlos? – awright18

Respuesta

1

Suponiendo que la llamada al único es la fuente del problema, en lugar de:

ctx.DataContext.Files.Single(...) 

cambio el código para permitir el regreso de varias filas de esa consulta y luego ingrese lo que está regresando cuando se devuelve más de una fila. Esto debería apuntarle hacia su problema de datos "duplicados".

Otra cosa a tener en cuenta es el SQL que se genera detrás de las escenas. No estoy seguro de que eso ayude, pero no puede doler. No conozco su modelo de datos, así que no puedo entender su código tan bien como me gustaría.

+0

El mensaje de excepción es bastante claro; Single impone el hecho de que solo se devolverá una fila. Dos o más llevarán a la excepción. Aunque no cambiaría el código; una instrucción sql simple encontrará a la víctima: 'seleccione fileid, count (*) del grupo Files por fileid teniendo count (*)> 1' – Andy

0

Si solo ocurre en Windows 7, esto podría deberse al sistema operativo. ¿Lo has probado en Vista? El entorno de Vista es similar a Windows 7. También puede usar Windows Virtual PC + XP Mode. Esta es una aplicación de virtualización especialmente diseñada para Windows 7 que permite a los usuarios ejecutar aplicaciones como las que usan en Windows XP. Nota: El modo XP requiere un procesador con capacidad de virtualización.

0

Tuve la misma excepción al eliminar una entidad. El problema resultó ser una relación de clave externa definida en el dbml -File. Entonces este fue el motivo de la excepción en mi caso. Después de eliminar eso, funcionó para eliminar el registro (y no quería eliminar en cascada los registros de la otra tabla, solo tengo que averiguar cómo configurar linq-to-sql para simplemente configurar la columna de clave externa para nulo)

Cuestiones relacionadas