Comment configurer ProviderManifestToken pour le code EF en premier

J’ai un projet asp.net MVC3 utilisant le code EF en premier. Pour mes tests unitaires, j’utilise SQL Server CE 4.0 et SQL Server 2008 Express. Les deux ont parfaitement fonctionné avec EF générant ma firebase database comme prévu.

Cependant, lorsque je lance mon application en dehors d’un test unitaire et que je le pointe vers mes chaînes de connexion,

ProviderIncompatibleException: le fournisseur n’a pas renvoyé de chaîne ProviderManifestToken

J’ai lu la documentation MS à ce sujet et il semble que ce soit un jeton SqlVersion que le modèle EF génère. Le problème est que j’utilise l’approche du code en premier, donc je n’ai pas de fichier .edmx et je ne sais pas où .edmx mes informations de métadonnées car la firebase database n’a pas encore été générée.

Je sais que mes chaînes de connexion en tant que nom de la firebase database, nom d’utilisateur et pass sont correctes, car leur modification à des valeurs incorrectes génère l’erreur attendue. Vous ne savez pas où commencer.

Merci.

Voici ma chaîne de connexion:

    

Si vous utilisez EF 6 (que vous venez de publier), vous avez une alternative.

Résolution de dépendance

Vous pouvez utiliser la nouvelle fonctionnalité de résolution des dépendances pour enregistrer une implémentation de IManifestTokenResolver (décrite dans cette documentation d’aperçu sous le nom IManifestTokenService ).

Cet article donne un peu plus d’informations sur l’utilisation de DbConfiguration . La manière la plus simple de l’utiliser est la suivante:

 DbConfigurationType(typeof(EntityFrameworkDbConfiguration))] public class MyContextContext : DbContext { } 

Cet exemple évite tout déplacement vers la firebase database lors de la création des métadonnées pour les connexions SQL Server et spécifie automatiquement la compatibilité de SQL Server 2005.

 using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.Infrastructure.DependencyResolution; using System.Data.SqlClient; ///  /// A configuration class for SQL Server that specifies SQL 2005 compatability. ///  internal sealed class EntityFrameworkDbConfiguration : DbConfiguration { ///  /// The provider manifest token to use for SQL Server. ///  private const ssortingng SqlServerManifestToken = @"2005"; ///  /// Initializes a new instance of the  class. ///  public EntityFrameworkDbConfiguration() { this.AddDependencyResolver(new SingletonDependencyResolver(new ManifestTokenService())); } ///  private sealed class ManifestTokenService : IManifestTokenResolver { ///  /// The default token resolver. ///  private static readonly IManifestTokenResolver DefaultManifestTokenResolver = new DefaultManifestTokenResolver(); ///  public ssortingng ResolveManifestToken(DbConnection connection) { if (connection is SqlConnection) { return SqlServerManifestToken; } return DefaultManifestTokenResolver.ResolveManifestToken(connection); } } } 

Après des heures de recherche et de violonage, j’ai trouvé le moyen de le faire. DbModelBuilder classe DbModelBuilder prend un DbProviderInfo dans sa méthode Build , donc je l’utilise au lieu de compter sur EF pour appeler OnModelCreated :

 // 'Entities' is my DbContext subclass, the "container" in EF terms. public static Entities GetNewContext() { // Get a connection, for example: var connection = new SqlConnection(GetConnectionSsortingng()); // Create a DbModelBuilder var modelBuilder = new DbModelBuilder(); // Configure the model builder. // I changed my DbContext subclass - added a public version of OnModelCreated and called it ConfigureModelBuilder Entities.ConfigureModelBuilder(modelBuilder); // Here's where the magic happens. // Build the model and pass the ProviderManifestToken (I use 2005 to avoid a bug in precision of sql datetime columns when using concurrency control) var model = modelBuilder.Build(new System.Data.Entity.Infrastructure.DbProviderInfo("System.Data.SqlClient", "2005")); // Comstack the model var comstackdModel = model.Comstack(); // Create the container (DbContext subclass). Ideally all the previous stuff should be cached. return new Entities(connection, comstackdModel, true); } 

Evidemment, cela nécessite une réorganisation (par exemple, mettre en cache le modèle compilé pour ne pas avoir à le reconstruire chaque fois qu’un contexte est créé).

Pour moi, cela a complètement résolu le problème. Prendre plaisir!

Je viens d’avoir ce problème exact, mais je l’ai tracé à mon service SQL Server ne fonctionnait pas. Je venais juste de redémarrer mon ordinateur et, généralement, il démarre seul mais pour une raison quelconque.

Dans mon cas, le nom de ma chaîne de connexion doit correspondre au nom de la classe de contexte.

Chaîne de connexion:

    

Classe de contexte:

 using System.Data.Entity; namespace Nunu.Models { public class NunuContext : DbContext { System.Data.Entity.DropCreateDatabaseIfModelChanges()); public DbSet NunuFirsts { get; set; } public DbSet NunuLasts { get; set; } } } 

J’ai trouvé, lorsque j’ai fourni explicite “ID utilisateur = abcUser; Password = somePwd;” dans ma chaîne de connexion, je suis capable de résoudre la même erreur. Plus tôt, j’utilisais “Trusted_Connection = true;”, ce qui me permettait de déboguer mon projet web, mais commençait à me donner une erreur – {“Le fournisseur n’a pas renvoyé une chaîne ProviderManifestToken.” J’ai essayé de déboguer le projet Azure après avoir ajouté mon projet Web en tant que rôle Web.

J’espère que cela aidera quelqu’un qui vit une situation similaire.

Merci, Vivek Bahl

Passer à la source de données = localhost a fonctionné pour moi aussi en utilisant MS SQL 2008 R2 Express

Changer la source de données en localhost dans le connectionSsortingng résolu mon problème.

J’ai rencontré ce problème lors de l’ utilisation du didacticiel MVC3 sur ASP.NET .

Ma solution a été d’utiliser (localhost) au lieu d’une source de données nommée. Cela fonctionne bien sur ma boîte, pour le travail de développement local, mais ne serait pas utile si la firebase database était sur un serveur séparé.

Cela s’est avéré utile pour moi: