Compartir a través de


Solución de problemas (LINQ to SQL)

Actualización: November 2007

La siguiente información expone algunos problemas que podría encontrar en sus aplicaciones de LINQ to SQL y proporciona sugerencias para evitar o reducir el efecto de estos problemas.

Otros problemas se tratan en Preguntas más frecuentes (LINQ to SQL).

Operadores de consulta estándar no admitidos

LINQ to SQL no admite todos los métodos de operador de consulta estándar (por ejemplo, ElementAt<TSource>). Como resultado, aunque los proyectos se compilen correctamente, pueden producir errores en tiempo de ejecución. Para obtener más información, vea traducción de operadores de consulta estándar [LINQ to SQL].

Problemas de memoria

Si una consulta utiliza una colección que reside en memoria y LINQ to SQLTable<TEntity>, la consulta se podría ejecutar en memoria, dependiendo del orden en el que se especifiquen las dos colecciones. Si la consulta se debe ejecutar en memoria, entonces es necesario recuperar los datos de la tabla de la base de datos.

Este enfoque es ineficiente y podría provocar un uso excesivo del procesador y de la memoria. Intente evitar esas consultas multidominio.

Nombres de archivo y SQLMetal

Para especificar un nombre de archivo de entrada, agregue el nombre a la línea de comandos como archivo de entrada. No se admite la inclusión del nombre de archivo en la cadena de conexión (mediante la opción /conn). Para obtener más información, vea Herramienta de generación de código (SqlMetal.exe).

Proyectos de biblioteca de clases

El Diseñador relacional de objetos crea una cadena de conexión en el archivo app.config del proyecto. En proyectos de biblioteca de clases, el archivo app.config no se utiliza. LINQ to SQL utiliza la cadena de conexión proporcionada en los archivos en tiempo de diseño. Al cambiar el valor en app.config, la base de datos a la que se conecta su aplicación no cambia.

Eliminación en cascada

LINQ to SQL no admite ni reconoce las operaciones de eliminación en cascada. Si desea eliminar una fila de una tabla que tiene restringidas las eliminaciones, deberá hacerlo mediante una de las siguientes opciones:

  • Establezca la regla ON DELETE CASCADE en la restricción de clave externa de la base de datos.

  • Utilice su propio código para eliminar primero los objetos secundarios que impiden que se elimine el objeto primario.

En caso contrario, se producirá una excepción SqlException.

Para obtener más información, vea Cómo: Eliminar filas de la base de datos (LINQ to SQL).

Expresión que no se puede consultar

Si obtiene el error "No se puede consultar una expresión de tipo [expresión]. Compruebe que no falta ninguna referencia de ensamblado", asegúrese de lo siguiente:

  • Su aplicación va destinada a .NET Compact Framework 3.5.

  • Tiene una referencia a System.Core.dll y System.Data.Linq.dll.

  • Tiene una directiva Imports (Visual Basic) o using (C#) para System.Linq y System.Data.Linq.

DuplicateKeyException

Durante la depuración de un proyecto de LINQ to SQL, se podrían recorrer las relaciones de una entidad. Al hacer esto, esos elementos se introducen en la caché, y LINQ to SQL se da cuenta de su presencia. Si, a continuación, intenta ejecutar Attach o InsertOnSubmit o un método similar que genere varias filas con que presenten la misma clave, se producirá la excepción DuplicateKeyException.

Excepciones de concatenación de cadenas

No se admite la concatenación sobre operandos asignados a [n]text y otros [n][var]char. Se produce una excepción para la concatenación de cadenas asignadas a los dos conjuntos diferentes de tipos. Para obtener más información, vea System.String (métodos - LINQ to SQL).

Omitir y aceptar excepciones en SQL Server 2000

Debe usar miembros de identidad (IsPrimaryKey) cuando utilice Take<TSource> o Skip<TSource> contra una base de datos de SQL Server 2000. La consulta debe realizarse contra una sola tabla (es decir, no una unión), o ser una operación Distinct, Except, Intersect o Union, y no debe incluir una operación Concat<TSource>. Para obtener más información, vea la sección de "Compatibilidad con SQL Server 2000" en traducción de operadores de consulta estándar [LINQ to SQL].

Este requisito no se aplica a SQL Server 2005.

GroupBy InvalidOperationException

Esta excepción se produce cuando un valor de columna es nulo en una consulta GroupBy que agrupa mediante una expresión boolean, como group x by (Phone==@phone). Dado que la expresión es boolean, se deduce que la clave será boolean, no nullableboolean. Cuando la comparación traducida genera un valor nulo (null), se realizará un intento de asignar un nullableboolean a un boolean, y se producirá la excepción.

Para evitar esta situación (suponiendo que desea tratar los valores null como falsos), utilice un enfoque como el siguiente:

GroupBy="(Phone != null) && (Phone=@Phone)"

Método parcial OnCreated()

Se llama al método generado OnCreated() cada vez que se llama al constructor de objeto, incluido el escenario en el que LINQ to SQL llama al constructor para realizar una copia para los valores originales. Tenga en cuenta este comportamiento si implementa el método OnCreated() en su propia clase parcial.

Vea también

Conceptos

Preguntas más frecuentes (LINQ to SQL)

Otros recursos

Funcionalidad de depuración (LINQ to SQL)