viernes, 15 de mayo de 2015

Cómo ver la SQL que genera una query en Linq en tiempo de ejecución

Una de las cosas que muchas veces necesito es saber qué cadena SQL me ha construido Linq para explotar la base de datos (MSSQL).

Hay varias herramientas para hacerlo, pero ninguna que yo conozca en tiempo de ejecución que sea más rápida que la Ventana Inmediato.

Lo primero es que debo te tener puesto el punto de ruptura en donde el debuggeador esté dentro del contexto, por ejemplo en el fichero BL desde estoy haciendo llamadas al Entity. Por ejemplo si estoy haciendo un Select y me está dando un pete.

Ctrl + Alt + i y abro la ventana,  y allí escribo algo tal que así:

? documentoBL.GetAll()

Al dar Enter, me saldrá toda la Select que compone GetAll() y podré ver donde está el error.

jueves, 14 de mayo de 2015

Entity Framework – Invalid object name <tablename>

Un error al parecer sencillo que me ha causado un dolor de cabeza.

Tengo una tabla tal que así en la base de datos:

image

Tengo un mapeo tal que así:

using System.Data.Entity.ModelConfiguration;

namespace ResNovae.Manager.DomainModel.Models.Mapping
{
   
public class Clientes_ModuloYesMap : EntityTypeConfiguration<Cliente_ModuloYes>
    {
       
public Clientes_ModuloYesMap()
        {
           
// Primary Key
           
this.HasKey(t => t.id_cliente_modulo);

           
// Table & Column Mappings
           
this.ToTable("Clientes_ModuloYes");

           
this.Property(t => t.id_cliente_modulo).HasColumnName("id_cliente_modulo");
           
this.Property(t => t.id_cliente).HasColumnName("id_cliente");
           
this.Property(t => t.id_modulo_yes_iso).HasColumnName("id_modulo_yes_iso");
        }
    }
}

Y cada vez que lanzo cualquier operación sobre la entidad me devuelve el error de que no encuentra la tabla…

NO LE DES VUELTAS, ES EL NOMBRE DEL MAPEO

Estoy tan acostumbrado a los mensajes crípticos de .NET o de (maldito mil veces) JavaScript, que no me creo cuando un mensaje de error dice exactamente cual es el error.

this.ToTable("Clientes_ModulosYes");

Me faltaba la maldita “s” de Modulos, no Modulo…