2011-01-22 4 views
5

J'essaie d'utiliser le code EF First avec mon application WPF, l'idée est de créer une base de données SqlCe dans AppData/MyApp (s'il n'y en a pas) et de l'utiliser avec EF Code d'abord.Utilisation du code EF First et SqlCe dans WPF

Pour l'instant, cela donne des erreurs lorsque j'essaie de lire des données de la base de données supposée créer, mais quand j'ai vérifié l'objet de contexte db, j'ai vu qu'il essayait de le créer dans SqlExpress. Tout d'abord, comment puis-je le configurer pour fonctionner avec CE au lieu de SqlExpress et définir l'emplacement du fichier?

J'ai essayé de changer la chaîne de connexion dans app.config mais je n'ai pas réussi à la faire fonctionner (elle n'a pas créé de fichier sdf) et je ne sais pas comment définir le chemin de connexion au dossier AppData tel qu'il est dans Dossier utilisateur (non fixé).

N'a jamais travaillé avec SqlCe ou le code EF Tout d'abord, donc toute aide est la bienvenue & apprécié.

Merci d'avance.

Répondre

6

J'ai réussi à le faire fonctionner après beaucoup de déconner. Mon app.config a ce qui suit:

<?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> 

Avoir la DbProviderFactory y contribuera en matière de déploiement aussi. Il permettra aux utilisateurs d'utiliser SQLCE 4 sans exécuter le programme d'installation pour cela (à condition de fournir les binares natifs, certaines informations ici: http://erikej.blogspot.com/2011/02/using-sql-server-compact-40-with.html).

+0

J'ai arrêté de courir après cela il y a quelque temps, donc je n'ai pas testé votre solution mais puisque personne d'autre n'a trouvé quelque chose et que vous avez déjà 2 votes, je vais accepter ça. Merci mec, je noterai la solution quelque part et je l'utiliserai probablement dans le futur! – Tiax

+0

Pour le code d'abord, après avoir configuré votre programme pour qu'il fonctionne sur votre système de développement, tout ce qui est vraiment nécessaire pour app.config consiste à ajouter les entrées de balises 'DbProviderFactories'. Code First effectue toutes les chaînes de connexion nécessaires pour vous. Vous devrez peut-être également vous assurer que les DLL SQLCE (du dossier Program Files [x86]) sont distribuées à côté de votre programme. –

0

Voici une indication possible. Si vous deviez installer EFCodeFirst.SqlServerCompact en utilisant le gestionnaire de paquets NuGet, et regarder dans: Visual Studio 2010 \ Projects \ MonProjet \ packages \ EFCodeFirst.SqlServerCompact.0.8.8482 \ Content, il fait des choses pour votre application web comme:

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

Je ne pense pas que l'outillage soit prêt pour SQLCE pour les projets WPF. Ça m'a aussi arrêté dans mes traces.

0

Cela ne va probablement pas aider à court terme, mais je pense que ce serait la meilleure solution à long terme. Je n'ai pas été en mesure de trouver où quelqu'un d'autre a documenté comment faire cela, donc je suppose que je vais devoir le comprendre à moins que quelqu'un avec une connaissance plus intime de l'utilisation SqlCE4, CodeFirst, et la création de paquets NuGet me bat pour il. Ce dont nous avons besoin, c'est d'un paquet NuGet, soit d'un nouveau paquet, soit d'un paquet assez intelligent pour le gérer, qui peut ajouter SqlCE4 et CodeFirst à un projet WPF et/ou WinForms.

Le package existant semble orienté vers les projets Web car il dépend de WebActivator. D'après ce que je peux dire, installer WebActivator sur un projet non-web n'est vraiment pas approprié. Je ne sais pas s'il est possible qu'un paquet NuGet détecte le type de projet et exécute une autre logique d'installation basée sur cette information. Il vaudrait mieux que tous ceux qui sont responsables de la maintenance du package EFCodeFirst.SqlServerCompact libèrent une version non Web ou rendent la version existante plus intelligente. En attendant, dans mon temps libre, je vais voir si je peux comprendre comment le faire et créer le mien. Je ne peux pas vous promettre combien de temps ça va me prendre parce que je suis presque complètement dans le noir en ce qui concerne la création de paquets NuGet. J'ai créé quelques uns vraiment basiques mais n'ai jamais fait de trucs avancés comme les transformations de config et autres.

+0

WebActivator depuis la version 1.3 prend en charge les scénarios «non Web». Vous pouvez exécuter les actions manuellement (utile dans les tests unitaires). –

Questions connexes