EF6 et configurations multiples (SQL Server et SQL Server Compact)

c# configuration entity-framework entity-framework-6

Question

Mise à jour: Problème résolu, voir la fin de cette question.

Le problème :

Nous essayons d'utiliser Entity Framework 6 et une configuration basée sur du code dans un scénario où nous avons utilisé à la fois SQL Server et SQL Server CE dans le même AppDomain .

Ce scénario assez simple ne semble pas être pris en charge "par conception". De l'équipe EF:

Remarque: nous ne prenons pas en charge l'utilisation de plusieurs classes de configuration dans le même AppDomain. Si vous utilisez cet attribut pour définir différentes classes de configuration pour deux contextes, une exception sera levée.

Plus d'informations ici: Configuration basée sur le code (Codeplex)

La question :

Comment pouvons-nous avancer à partir d'ici? Toute aide serait grandement appréciée! Existe-t-il un moyen plus flexible de connecter une configuration à un contexte plutôt qu’à un AppDomain ?

(Nos classes de contexte sont situées dans différents assemblys. Nous avons essayé l'attribut DbConfigurationType mais le problème est EF lui-même)

Fichiers de configuration:

Configuration pour serveur SQL normal

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

Configuration pour SQL Server Compact Edition

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

METTRE À JOUR:

L'erreur que nous obtenons est:

System.TypeInitializationException: l'initialiseur de type pour 'MyProject.Repositories.Base.DataContext' a renvoyé une exception. ----> System.InvalidOperationException: une instance de 'EfCeConfiguration' a été définie, mais ce type n'a pas été découvert dans le même assemblage que le contexte 'DataContext'. Placez le type DbConfiguration dans le même assembly que le type DbContext, utilisez DbConfigurationTypeAttribute sur le type DbContext pour spécifier le type DbConfiguration ou définissez le type DbConfiguration dans le fichier de configuration. Voir http://go.microsoft.com/fwlink/?LinkId=260883 pour plus d'informations.

UPDATE 2, la solution Comme décrit ci-dessus, nous ne pouvons avoir qu'une seule configuration. C'est un problème car Sql et SqlCe utilisent différents fournisseurs. Si nous utilisons "SetDefaultConnectionFactory" pour s’adapter à un type de base de données, l’autre échouera.

Au lieu de cela, fournissez la connexion dans le contexte comme décrit dans l'article marqué comme réponse ci-dessous. Une fois que vous initialisez toujours le contexte avec une connexion plutôt qu'une chaîne de connexion, vous êtes prêt à partir. Vous pouvez supprimer l'appel SetDefaultConnectionFactory de la configuration. Nous utilisons uniquement le code ci-dessous pour configurer le contexte SqlCe et aucune configuration pour le contexte Sql.

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

Réponse acceptée

EDIT: basé sur les détails de l'erreur: Avez-vous déjà essayé d'indiquer à EF où se trouve la classe de configuration?

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

Si cela ne peut pas être fait le travail, alors voir une alternative

Utiliser le contexte avec le constructeur DbConnection

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

vous avez ensuite besoin d'une connexion "DBConnection" pour chaque fournisseur. Pour serveur SQL

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

répéter pour l’usine SqlCe, il peut également générer un facteur de connexion DBConnection SqlCe créer une connexion


Réponse populaire

ce que j'ai fait:

public partial class MyDataBaseContext : DbContext
{
    public MyDataBaseContext (string ConnectionString)
        : base(ConnectionString)
    {
    }
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi