Compartir a través de


Preguntas más frecuentes (LINQ to SQL)

Actualización: November 2007

Las siguientes secciones dan respuesta a algunos problemas comunes que podría encontrar al implementar LINQ.

Otros problemas se tratan en Solución de problemas (LINQ to SQL).

No se puede conectar

P. No puedo conectarme a mi base de datos.

R. Asegúrese de que su cadena de conexión es correcta y que su instancia de SQL Server se está ejecutando. También tenga en cuenta que LINQ to SQL requiere que el protocolo Canalizaciones con nombre esté habilitado. Para obtener más información, vea Aprender mediante tutoriales (LINQ to SQL).

La base de datos pierde los cambios realizados

P. Realicé un cambio en los datos de la base de datos, pero, cuando volví a ejecutar mi aplicación, el cambio ya no estaba.

R. Asegúrese de que llama a SubmitChanges para guardar los resultados en la base de datos.

Conexión a bases de datos: ¿cuánto tiempo permanece abierta?

P. ¿Cuánto tiempo permanece abierta mi conexión a una base de datos?

R. Normalmente, una conexión permanece abierta hasta que se utilizan los resultados de la consulta. Si espera que los resultados tarden tiempo en procesarse, y no se opone a que se almacenen en memoria caché, aplique ToList<TSource> a la consulta. En escenarios habituales donde cada objeto se procesa sólo una vez, el modelo de transmisión por secuencias es superior tanto en DataReader como en LINQ to SQL.

Los detalles exactos de uso de la conexión dependen de lo siguiente:

Actualizaciones sin consultas

P. ¿Puedo actualizar los datos de la tabla sin consultar primero la base de datos?

R. Aunque LINQ to SQL no posee comandos de actualización basados en conjuntos, puede utilizar cualquiera de las técnicas siguientes para actualizar sin consultar primero:

  • Utilice ExecuteCommand para enviar código SQL.

  • Cree una nueva instancia del objeto e inicialice todos los valores (campos) actuales que afectan a la actualización. A continuación, asocie el objeto al DataContext utilizando Attach y modifique el campo que desee cambiar.

Resultados inesperados en la consulta

P. Mi consulta devuelve resultados inesperados. ¿Cómo puedo inspeccionar lo que está ocurriendo?

R. LINQ to SQL proporciona varias herramientas para inspeccionar el código SQL que genera. Una de las más importantes es Log. Para obtener más información, vea Funcionalidad de depuración (LINQ to SQL).

Resultados inesperados del procedimiento almacenado

P. Tengo un procedimiento almacenado cuyo valor devuelto se calcula mediante MAX(). Cuando arrastro el procedimiento almacenado hasta la superficie de Diseñador relacional de objetos, el valor devuelto no es correcto.

R. LINQ to SQL proporciona dos maneras de devolver los valores generados por la base de datos a través de procedimientos almacenados:

  • Asignando un nombre al resultado de salida.

  • Especificando explícitamente un parámetro de salida.

El siguiente es un ejemplo de resultado incorrecto. Dado que LINQ to SQL no puede asignar los resultados, siempre devuelve 0:

create procedure proc2

as

begin

select max(i) from t where name like 'hello'

end

El siguiente es un ejemplo de resultado correcto que utiliza un parámetro de salida:

create procedure proc2

@result int OUTPUT

as

select @result = MAX(i) from t where name like 'hello'

go

El siguiente es un ejemplo de resultado correcto que asigna un nombre al resultado de salida:

create procedure proc2

as

begin

select nax(i) AS MaxResult from t where name like 'hello'

end

Para obtener más información, vea Personalizar las operaciones mediante procedimientos almacenados (LINQ to SQL).

Errores de serialización

P. Cuando intento serializar, obtengo el siguiente error: "El tipo 'System.Data.Linq.ChangeTracker+StandardChangeTracker'... no está marcado como serializable".

R. La generación de código en LINQ to SQL admite serialización DataContractSerializer. No admite XmlObjectSerializer o BinaryFormatter. Para obtener más información, vea Serialización (LINQ to SQL).

Múltiples archivos DBML

P. Cuando tengo varios archivos DBML que comparten algunas tablas, obtengo un error del compilador.

R. Establezca las propiedades Espacio de nombres del contexto y Espacio de nombres de la entidad de Diseñador relacional de objetos en un valor distinto para cada archivo DBML. Este enfoque elimina la colisión entre nombres o espacios de nombres.

Evitar el establecimiento explícito de valores generados por la base de datos al insertar o actualizar

P. Tengo una tabla de base de datos con una columna DateCreated que tiene como valor predeterminado Getdate() de SQL. Cuando intento insertar un nuevo registro utilizando LINQ to SQL, el valor queda establecido en NULL. Lo que esperaba es que tomara el valor predeterminado de la base de datos.

P. LINQ to SQL administra automáticamente esta situación para la identidad (incremento automático) y rowguidcol (GUID generado por base de datos) y para las columnas con marca de tiempo. En otros casos, debería establecer manualmente IsDbGenerated=true y AutoSync=Always/OnInsert/OnUpdate.

Múltiples DataLoadOptions

P. ¿Puedo especificar opciones de carga adicionales sin sobrescribir la primera?

R. Sí. La primera no se sobrescribe, como se muestra en el ejemplo siguiente:

Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Order)(Function(o As Order) o.Customer)
dlo.LoadWith(Of Order)(Function(o As Order) o.OrderDetails)
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(o => o.Customer);
dlo.LoadWith<Order>(o => o.OrderDetails);

Errores en el uso de SQL Compact 3.5

P. Obtengo un error cuando arrastro tablas fuera de una base de datos SQL Server Compact 3.5.

R. El Diseñador relacional de objetos no admite SQL Server Compact 3.5, aunque el motor de ejecución de LINQ to SQL sí lo hace. En esta situación, debe crear sus propias clases de entidad y agregar los atributos adecuados.

Errores en relaciones de herencia

P. Utilizo la herramienta de herencia incluida en el cuadro de herramientas del Diseñador relacional de objetos para conectar dos entidades, pero obtengo errores.

R. Crear una relación no es suficiente. Debe proporcionar información tal como la columna de discriminador, el valor de discriminador de la clase base y el valor de discriminador de la clase derivada.

Modelo de proveedor

P. ¿Existe un modelo de proveedor público disponible?

R. No existe ningún modelo de proveedor público disponible. En este momento, LINQ to SQL sólo admite SQL Server y SQL Server Compact 3.5.

Ataques mediante inserción de SQL

P. ¿Cómo se protege LINQ to SQL de ataques de inserción de SQL?

R. La inserción de SQL ha sido un riesgo significativo para las consultas SQL tradicionales formadas mediante concatenación de los datos proporcionados por el usuario. LINQ to SQL evita esa inserción mediante el uso de SqlParameter en las consultas. Los datos proporcionados por el usuario se convierten en valores de parámetro. Este enfoque impide que se utilicen comandos malintencionados en los datos proporcionados por el cliente.

Cambiar el marcador de sólo lectura en archivos DBML

P. ¿Cómo elimino los establecedores procedentes de algunas propiedades cuándo creo un modelo de objetos a partir de un archivo DBML?

R. Siga estos pasos para este escenario avanzado:

  1. En el archivo .dbml, modifique la propiedad cambiando el marcador IsReadOnly a True.

  2. Agregue una clase parcial. Cree un constructor con parámetros para los miembros de sólo lectura.

  3. Revise el valor predeterminado de UpdateCheck (Never) para determinar si ése es el valor correcto para su aplicación.

    Precaución:

    Si está utilizando el Diseñador relacional de objetos en Visual Studio, sus cambios podrían resultar sobrescritos.

APTCA

P. ¿Está System.Data.Linq marcado para que el código de confianza parcial pueda utilizarlo?

A. Sí, el ensamblado System.Data.Linq.dll se encuentra entre los ensamblados de .NET Framework marcados con el atributo AllowPartiallyTrustedCallersAttribute. Sin esta señal, los ensamblados incluidos en .NET Framework están destinados para su uso en código de plena confianza.

El principal escenario de LINQ to SQL para permitir llamadores que no son de plena confianza es habilitar el ensamblado de LINQ to SQL desde aplicaciones web, cuya configuración de confianza es Media.

Asignación de datos procedentes de varias tablas

P. Los datos de mi entidad proceden de varias tablas. ¿Cómo realizo la asignación?

R. Puede crear una vista en una base de datos y asignar la entidad a la vista. LINQ to SQL genera el mismo código SQL para vistas que para tablas.

Nota:

El uso de vistas en este escenario presenta limitaciones. Este enfoque funciona de forma más segura cuando las operaciones realizadas sobre Table<TEntity> se admiten en la vista subyacente. Sólo usted puede saber qué operaciones son las deseadas. Por ejemplo, la mayoría de las aplicaciones son de sólo lectura, y otro número considerable realiza operaciones Create/Update/Delete sólo mediante procedimientos almacenados ejecutados contra vistas.

Agrupar conexiones

P. ¿Existe una construcción que pueda ayudar con el agrupamiento de DataContext?

R. No intente reutilizar instancias de DataContext. Cada DataContext mantiene el estado (incluida una caché de identidad) para una sesión de edición o consulta particular. Para obtener nuevas instancias según el estado actual de la base de datos, utilice un nuevo DataContext.

Puede seguir utilizando agrupamiento de conexiones ADO.NET subyacente. Para obtener más información, vea Agrupación de conexiones en SQL Server (ADO.NET).

El segundo DataContext no resulta actualizado

P. Utilizo una instancia de DataContext para almacenar valores en la base de datos. Sin embargo, un segundo DataContext en la misma base de datos no refleja los valores actualizados. La segunda instancia de DataContext parece devolver valores almacenados en memoria caché.

R. Este comportamiento está diseñado así. LINQ to SQL continúa devolviendo los mismos valores o instancias que aparecen en la primera instancia. Cuando se realizan actualizaciones, se utiliza simultaneidad optimista. Los datos originales se utilizan para realizar una comprobación contra el estado de la base de datos actual a fin de comprobar que, de hecho, permanecen sin modificar. Si han cambiado, se produce un conflicto, y su aplicación deberá resolverlo. Una opción para su aplicación es restablecer el estado original al estado actual de la base de datos e intentar de nuevo la actualización. Para obtener más información, vea Cómo: Administrar los conflictos de cambios (LINQ to SQL).

También puede establecer ObjectTrackingEnabled como falso, lo cual desactiva el almacenamiento en memoria caché y el seguimiento de cambios. A continuación, puede recuperar los últimos valores cada vez que realiza una consulta.

No se puede llamar a SubmitChanges en modo de sólo lectura

P. Cuando intento llamar a SubmitChanges en modo de sólo lectura, obtengo un error.

R. El modo de sólo lectura desactiva la capacidad del contexto de realizar seguimiento de cambios.

Vea también

Tareas

Solución de problemas (LINQ to SQL)

Conceptos

Seguridad en LINQ to SQL

Otros recursos

Referencia (LINQ to SQL)