2010-05-10 8 views
4

J'utilise le cadre d'entités Ado.Net avec du code uniquement (tutoriel à l'adresse: ADO.NET team blog) et je veux être aussi indépendant de la base de données que possible.Impossible de déterminer le nom du fournisseur pour la connexion de type 'System.Data.SqlServerCe.SqlCeConnection'

Dans ma première approche, je veux juste opter pour les bases de données Sql Express et Sql Compact. Avec Sql Express, tout fonctionne bien mais avec Sql Compact, je reçois l'exception mentionnée dans ma question.

Est-ce que quelqu'un sait s'il est possible de se connecter à Sql Compact avec l'approche Code seulement? (! Avec un fichier .edmx généré pour une base de données Sql Compact everthing fonctionne très bien, mais je veux utiliser le code uniquement)

Voici un code:

ma classe qui construit le DataContext:

public class DataContextBuilder : IDataContextBuilder 
{ 
    private readonly DbProviderFactory _factory; 

    public DataContextBuilder(DbProviderFactory factory) 
    { 
     _factory = factory; 
    } 

    #region Implementation of IDataContextBuilder 

    public IDataContext CreateDataContext(string connectionString) 
    { 
     var builder = new ContextBuilder<DataContext>(); 
     RegisterConfiguration(builder); 

     var connection = _factory.CreateConnection(); 
     connection.ConnectionString = connectionString; 

     var ctx = builder.Create(connection); 

     return ctx; 
    } 

    #endregion 

    private void RegisterConfiguration(ContextBuilder<DataContext> builder) 
    { 
     builder.Configurations.Add(new PersonConfiguration()); 
    } 
} 

La ligne

var ctx = builder.Create (connexion);

lève l'exception.

Le IDataContext est juste une interface simple pour ObjectContext:

public interface IDataContext 
{ 
    int SaveChanges(); 

    IObjectSet<Person> PersonSet { get; } 
} 

Ma chaîne de connexion est configurée dans le app.config:

<connectionStrings> 
<add name="CompactConnection" connectionString="|DataDirectory|\Test.sdf" 
    providerName="System.Data.SqlServerCe.3.5" /> 
</connectionStrings> 

Et l'action de construction est démarré avec

var cn = ConfigurationManager.ConnectionStrings["CompactConnection"]; 
var factory = DbProviderFactories.GetFactory(cn.ProviderName); 
var builder = new DataContextBuilder(factory); 
var context = builder.CreateDataContext(cn.ConnectionString); 

Répondre

3

Je dois répondre à ma propre question.

Cela fonctionne maintenant avec le Entity Framework CTP 4

et SQL Server Compact 4.0

+0

vous pouvez télécharger Sql Server Compact 4.0 à http://blogs.msdn.com/b/sqlservercompact/archive/2010/ 07/07/introduction-sql-server-compact-4-0-la-prochaine-gen-embedded-database-from-microsoft.aspx – Hobbes1312

+0

Merci beaucoup! J'avais d'abord essayé 4.0, mais j'avais fait une erreur moi-même. Puis j'ai essayé 3.5 et je n'ai obtenu aucun endroit. Puis j'ai encore essayé 4.0, j'avais déjà réparé mon erreur et j'ai vu ta réponse. Merci beaucoup! – Chad

+0

C'était mon problème aussi. L'installation SqlServerCe 4.0 n'a pas mis les DLL dans la liste d'adresses globale, donc je les ai copiées manuellement dans mon projet et les ai ajoutées. Merci. –