2011-01-22 25 views
5

Estoy tratando de usar EF Code First con mi aplicación WPF, la idea es crear un SqlCe Db en AppData/MyApp (si no hay uno) y usarlo con EF Primero el códigoUsando EF Code First y SqlCe en WPF

Por el momento da error cuando trato de leer datos de la base de datos que se supone que debe crear, pero cuando revisé el objeto de contexto db vi que está intentando crearlo en SqlExpress.

Antes que nada, ¿cómo puedo configurarlo para que funcione con CE en lugar de SqlExpress y establecer la ubicación del archivo?

Intenté cambiar la cadena de conexión en app.config pero no pude hacer que funcionara (no creó el archivo sdf) y tampoco estoy seguro de cómo establecer la ruta de la cadena de conexión a la carpeta AppData tal como está en Carpeta de usuario (no fija).

Nunca funcionó con SqlCe o el código EF Primero antes, por lo que cualquier ayuda es bienvenida & apreciada.

Gracias de antemano.

Respuesta

6

Me las he arreglado para ponerlo en funcionamiento después de mucho perder el tiempo. Mi app.config tiene la siguiente:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 

    <connectionStrings> 
    <add name="Database" 
     connectionString="Data Source=Database.sdf" 
     providerName="System.Data.SqlServerCe.4.0" /> 
    </connectionStrings> 

    <system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SqlServerCe.4.0" /> 
     <add name="Microsoft SQL Server Compact Data Provider 4.0" 
      invariant="System.Data.SqlServerCe.4.0" 
      description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
      type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> 
    </DbProviderFactories> 
    </system.data> 

</configuration> 

Tener la DbProviderFactory allí le ayudará a la hora de despliegue demasiado. Permitirá a los usuarios usar SQLCE 4 sin ejecutar el instalador (siempre que suministre también los binares nativos, aquí hay información: http://erikej.blogspot.com/2011/02/using-sql-server-compact-40-with.html).

+0

Dejé de perseguir esto hace algún tiempo, por lo que no he probado su solución, pero como nadie ha encontrado nada y usted ya tiene 2 votos, lo acepto. Gracias, hombre, notaré la solución en algún lado y probablemente la use en el futuro. – Tiax

+0

Para Code First, después de configurar su programa para que funcione en su sistema de desarrollo, todo lo que realmente se necesita para app.config es agregar las entradas de etiqueta 'DbProviderFactories'. Code First hace todas las cadenas de conexión necesarias para usted. También es posible que deba asegurarse de que las DLL de SQLCE (de la carpeta Archivos de programa [x86]) se distribuyan junto con su programa. –

0

Aquí hay una pista posible. Si tuviera que instalar EFCodeFirst.SqlServerCompact usando NuGet Package Manager, y busque en: Visual Studio 2010 \ Projects \ MyProject \ packages \ EFCodeFirst.SqlServerCompact.0.8.8482 \ Content, hace cosas para su aplicación web como:

public static class AppStart_SQLCEEntityFramework { 
    public static void Start() { 
     DbDatabase.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"); 

     // Sets the default database initialization code for working with Sql Server Compact databases 
     // Uncomment this line and replace CONTEXT_NAME with the name of your DbContext if you are 
     // using your DbContext to create and manage your database 
     //DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<CONTEXT_NAME>()); 
    } 
} 
0

No creo que las herramientas estén listas para SQLCE para proyectos de WPF. También me detuvo en seco.

0

Esto probablemente no va a ayudar en el corto plazo, pero creo que sería la mejor solución a largo plazo. No he podido encontrar dónde alguien más ha documentado cómo hacerlo, así que supongo que tendré que resolverlo a medida que avance, a menos que alguien con más conocimiento sobre el uso de SqlCE4, CodeFirst y la creación de paquetes NuGet me gane. eso. Lo que necesitamos es un paquete NuGet, ya sea un paquete nuevo o uno que sea lo suficientemente inteligente como para manejarlo, que pueda agregar SqlCE4 y CodeFirst a un proyecto de WPF y/o WinForms.

El paquete existente parece orientarse a proyectos web ya que depende de WebActivator. Por lo que puedo decir, instalar WebActivator en un proyecto no web realmente no es apropiado. No sé si es posible que un paquete NuGet detecte el tipo de proyecto y ejecute una lógica de instalación diferente en función de esa información. Sería mejor para cualquiera que sea responsable de mantener el paquete EFCodeFirst.SqlServerCompact liberar una versión que no sea web o hacer que la existente sea más inteligente.

A la espera de eso, en mi tiempo libre voy a ver si puedo descubrir cómo hacerlo y crear el mío. No puedo prometer cuánto tiempo me tomará porque estoy casi totalmente en la oscuridad con respecto a la creación de paquetes NuGet. He creado un par de cosas realmente básicas, pero nunca he hecho cosas avanzadas como las transformaciones de configuración y cosas por el estilo.

+0

WebActivator desde la versión 1.3 admite escenarios 'no web'. Puede ejecutar las acciones manualmente (útil en pruebas unitarias). –

Cuestiones relacionadas