26 de Abril de 2018
Nov
1

Entity Framework + SQL CE 3.5 + Visual Studio 2010 y campos autonuméricos

Hoy veremos que si trabajamos con Entity Framework + SQL Compact Edition 3.5 (que es la versión que viene por 'defecto' con Visual Studio 2010) podemos tener problemas con los campos de tipo autonumérico.

Hay dos soluciones para evitar esto:

a) La más obvia pasa por no usar campos autonuméricos en nuestras entidades y substituirlos por campos de tipo "string" que se llenarán por código con un guid, como puede ser por ejemplo: autor.id = Guid.NewGuid().ToString();

b)  La otra posibilidad pasa por usar SQL Server Compact 4.0 que es lo que vamos hacer en este tutorial

El primer paso, es instalar SQL Server Compact 4.0 y unas "tools" para poder manipular bases de datos de SQLce4.0 desde Visual Studio 2010.

Para ello, usaremos el Microsoft Web Platform Installer e instalaremos estos dos paquetes: 


(haz click para agrandar)

Bien, vamos a crear una aplicación muy simple para ver que sucede cuando se usa una base de de datos sqlce 3.5 y que sucede cuando se usa otra sqlce4.0

Lo primero, creamos una solución vacia y agregamos un proyecto de Biblioteca de clases.

Borramos el archivo Class1.cs/vb y agregamos dos bases de datos, una será Base de datos local (sqlce3.5) y otra será Base de datos local de SQL Server Compact 4.0: 


(haz click para agrandar)

Nota: Lo hacemos así "rápido". Otra forma, sería crea las bases de datos desde el Explorador de Servidores, agregando una nueva conexión y estableciendo el origen de datos como SQLce 3.5 o SQLce 4.0

Bueno, el caso es que al final tenemos algo como esto: 

Nota: Al agregar una base de datos SQLce 4.0 se nos agrega automáticamente una referencia a System.Data.SqlServerCe que hace referencia a una dll de la versión "4" del SQL Compact Edition 4.0

Bien, añadimos a nuestro proyecto de biblioteca de clases un nuevo ADO.NET Entity Model vacio y agregamos una entidad "Autor" cuyo campo id es de tipo autonumérico.

El resto de campos son de tipo "string" (nvarchar)

Sobre el modelo de entidades, pulsamos botón derecho y seleccionamos Generar base de datos desde el modelo: 


(haz click para agrandar)

Como veís aquí está el primer "problema". En modelo de entidades solo se puede aplicar a una base de datos de SQL Server o SQL ce 3.5, no 4.0.

Esto es una "limitación" de Visual Studio 2010. De todas formas, dont panic.

Elegimos el origen de datos SQLce3.5: 


(haz click para agrandar)

y seleccionamos nuestra base de datos (la base de datos existe pero no tiene ninguna tabla) SQLce3.5 que añadimos al principio:


(haz click para agrandar)

Estos pasos en realidad no generan la base de datos, generan un script para genera las tablas en dicha base de datos: 


(haz click para agrandar)

Ejecutamos el script (botón derecho, ejecutar) se nos pide una conexión, seleccionamos la base de datos correspondiente y voilá, ya tenemos la tabla de nuestro modelo de entidades en la base de datos.

Para comprobarlo, nos vamos a nuestro explorador de servidores y agregamos una nueva conexión: 


(haz click para agrandar)

Nota: fíjate que aquí si que se puede seleccionar SQL ce 4.0, debido a que tenemos instaladas las "tools" de SQLce 4.0 para Visual Studio 2010.

Bueno, el caso que que una vez añadida la conexión podemos ver que efectivamente, se ha creado la tabla de nuestro modelo de entidades den la base de datos SQLce 3.5: 


(haz click para agrandar)

Bien, segundo paso. Vamos a crear una aplicación que consuma nuestro modelo de entidades, en este caso una aplicación Windows Form de toda la vida.

Para ello agregamos un nuevo proyecto a nuestra solución llamado DemoApp de tipo Windows Form, agregamos una referencia a nuestra librería de clases, copiamos el App.Config de nuestra librería de clases en este nuevo proyecto y por último agregamos un modelo vacio de ADO.NET Entity model que inmediatamente borraremos. Esto último solo lo hacemos para que Visual Studio añada las referencias de System.Data.xxxx necesarias para poder consumir nuestro modelo.

Bien, al final tendremos algo como esto: 

En nuestro formulario, añadimos un control botón que tendrá el código para añadir un autor a la tabla de autores.

El código es realmente simple y no tiene mayor misterio: 


(haz click para agrandar)

Ponemos un breakpoint en db.SaveChanges(); puesto que "sabemos" que esta insercción va a fallar debido a que la base de datos en SQL ce 3.5 y efectivamente, así sucede:


(haz click para agrandar)

Como se puede ver la execepción no deja lugar a dudas: "SQL Server Compact no admite claves y valores generados por el servidor."

Pues vaya... :(

Solución quiero!!! 

Lo primero, en el App.Config que nuestra librería de clases cambiaremos la cadena de conexión para indicar que el modelo de entidades usará SQLce 4.0 en lugar del 3.5:


(haz click para agrandar)

En nuestro en el explorador de soluciones, seleccionaremos nuestor modelo de entidades (.edmx) y con el botón derecho seleccionaremos la ocpión "Abrir con..." y seleccionamos la opción "Editor XML":

Esto nos muestra el modelo de entidades en formato XML. Cambiaremos el Provider y ProviderManifestToken por System.Data.SqlServerCe.4.0 y 4.0 respectivamente:


(haz click para agrandar)

Guardarmos los cambios.

Nos vamos al script de generación de la base de datos, nos desconectamos (importante) y volvemos a ejecutar el script. Ahora seleccionamos la base de datos SQLce4.0: 


(haz click para agrandar)

Copiamos de nuevo el App.Config de la libreria de clases en nuesta DemoApp y ejecutamos nuestra mega-aplicación y...premio. Se guarda (y genera) el registro en la base de datos, esta vez, sin ninguna excepción:


(haz click para agrandar)

Os dejo este enlace de un MVP de SQL CE que contiene numerosas herramientas para trabajar con SQL CE, que van desde integración en Visual Studio, hasta herramientas de migración (como el caso de SqlCeCmd) de 3.5 a 4.0 y un montón de cosas mas.

Nota: Con SQL Server Management Studio 2008 (R2 incluido) puedes trabajar con bases de datos SQLce 3.5, pero no con SQLce 4.0 (link de StackOverflow que lo deja bastante claro) y las versiones superiores (Management Studio 2012 ya no tiene soporte para SQLce)

 

Saludos.
mov eax,ollydbgInt 13h

 


 

Ollydbg ProSignature 

0

1 Comentario:

Una pregunta, ¿hay algún

Una pregunta, ¿hay algún libro físico o electrónico sobre lecciones básicas de informática para ir aprendiendo algo?