Est-il possible d'utiliser le même model Entity Framework pour SQL Express et SQL CE 4.0?

Je travaille actuellement sur un projet SOA où, à certains endroits, il serait logique que le service utilise une database légère (SQL CE 4.0) tandis qu'à d'autres endroits une database plus robuste est souhaitable (SQL Express en ce moment, mais peut-être aux éditions plus grandes).

Même si la structure du model et de la table est identique pour SQL Express et SQL CE, je n'arrive pas à comprendre comment utiliser Entity Framework pour utiliser le même EDMX pour travailler avec les deux bases de données. Le model conceptuel est identique pour les deux, et la seule différence dans le model de stockage est le nom du fournisseur qui est utilisé pour accéder à la database.

Ai-je manqué quelque chose, ou dois-je garder deux templates fondamentalement identiques autour, un pour chaque database.

J'utilise .NET 4.0, Entity Framework et VS 2010 SP1

Malheureusement, je pense que vous devez créer deux SSDL séparés avec un fournisseur différent et les garder manuellement en synchronisation (cela peut être fait par un script post-construction qui va copyr le file ssdl et replace un fournisseur). Encore faut-il être sûr que les structures des tables sont les mêmes:

  • noms de la même table
  • mêmes noms de colonnes
  • mêmes types de données

Le dernier point peut être critique car comme je sais que SQL CE ne supporte pas certains types communs dans SQL Server. Par exemple, je pense que navarchar(max) et nvarbinary(max) ne sont pas supportés dans SQL CE.

Pour forcer EF à créer un file SSDL au lieu de l'inclure en tant que ressource, modifiez Metadata Artifcat Processing (dans les propriétés du concepteur EDMX) pour copyr dans le directory de sortie et modifier la string de connection. Voici un article connexe.

Vous pouvez le faire si cela ne vous dérange pas de passer au code d'abord. Gallery Server Pro 3.0 utilise Code First pour cibler SQL CE ou SQL Server, selon les preferences de l'user. Il y a une seule base de code avec la seule différence étant la string de connection dans web.config.

C'est un projet open source donc vous pouvez voir comment cela se fait dans le code.