web-dev-qa-db-fra.com

C # Entity Framework: mot-clé non pris en charge: 'port'

Bonjour, j'ai plusieurs projets connectés à une certaine base de données CodeFirst Entity Framework.

Tous les projets sont capables de se connecter avec succès, à l’exception d’un seul.

L'erreur que je reçois est: Keyword not supported: 'port'

J'ai parcouru d'innombrables questions sur stackoverflow, des forums mysql, des forums de structures d'entités, etc., notamment:

MappingException Edm.String incompatible avec SqlServer.varbinary

Mot clé non pris en charge dans la chaîne de connexion de MySQL

Mot clé non pris en charge: 'métadonnées' + MySQL

Ma chaîne de connexion ressemble à: server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123

Mon fichier db.cs ressemble à:

public partial class MyDB : DbContext
{
    public MyDB ()
        : base("server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123")
    {
        Logger.Trace("test123");
    }

    public virtual DbSet<MyItem> MyItems { 
get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyItem>()
            .Property(e => e.Content)
            .IsUnicode(false);
    }
}

Lorsque je supprime le port:3306 de la chaîne de connexion, je reçois ceci: System.Data.Entity.Core.MappingException: Schema specified is not valid. Errors: (8,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.DateTime[Nullable=False,DefaultValue=,Precision=]' of member 'Time' in type 'something.Model.MyItem' is not compatible with 'SqlServer.timestamp[Nullable=False,DefaultValue=,MaxLength=8,FixedLength=True,StoreGeneratedPattern=Identity]' of member 'time' in type 'CodeFirstDatabaseSchema.MyItem'. at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.Init(EdmItemCollection edmCollection, StoreItemCollection storeCollection, IEnumerable`1 xmlReaders, IList`1 filePaths, Boolean throwOnError) at System.Data.Entity.Core.Mapping.StorageMappingItemCollection..ctor(EdmItemCollection edmCollection, StoreItemCollection storeCollection, IEnumerable`1 xmlReaders) at System.Data.Entity.ModelConfiguration.Edm.DbDatabaseMappingExtensions.ToStorageMappingItemCollection(DbDatabaseMapping databaseMapping, EdmItemCollection itemCollection, StoreItemCollection storeItemCollection) at System.Data.Entity.ModelConfiguration.Edm.DbDatabaseMappingExtensions.ToMetadataWorkspace(DbDatabaseMapping databaseMapping) at System.Data.Entity.Internal.CodeFirstCachedMetadataWorkspace..ctor(DbDatabaseMapping databaseMapping) at System.Data.Entity.Infrastructure.DbCompiledModel..ctor(DbModel model) at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) at System.Data.Entity.DbSet`1.Add(TEntity entity) at MyFunction(Int32 userId, String id, String type, String contentJsonString) in

J'utilise MySql Connector et non Sql Server ...

Cela me stoppe complètement, ainsi que le reste de mon équipe.

Edit: Voici mon Web.Config

<?xml version="1.0"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> </configSections> <appSettings file="config-sources\app-settings.config"/> <system.web> <compilation debug="true" targetFramework="4.5.2"> <assemblies> <add Assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </assemblies> </compilation> <httpRuntime targetFramework="4.5.1"/> </system.web> <connectionStrings configSource="config-sources\ef-connection-strings.config"/> <runtime> <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MySql.Data" publicKeyToken="C5687FC88969C44D" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.8.3.0" newVersion="6.8.3.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.3.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0"/> </dependentAssembly> </assemblyBinding> </runtime> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0"/> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="POST,HEAD,GET" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> <security> <requestFiltering> <verbs> <add verb="POST" allowed="true"/> </verbs> </requestFiltering> </security> <defaultDocument> <files> <add value="webhook.ashx"/> </files> </defaultDocument> </system.webServer> </configuration>

5
Alon Bukai

L'argument de la base utilisée DbContextconstructor s'appelle nameOrConnectionString. Par conséquent, il prend en charge le nom d'une chaîne de connexion à partir du fichier de configuration ou, comme dans votre cas, une chaîne de connexion réelle.

Le problème avec ce dernier est qu’il ne permet pas de spécifier le nom du fournisseur comme avec le premier provenant de la configuration, auquel cas EF utilise celui spécifié dans l’élément de configuration defaultConnectionFactory, qui dans votre cas est System.Data.Entity.Infrastructure.SqlConnectionFactory, en d'autres termes - Sql Server, d'où l'exception port non prise en charge.

Il existe plusieurs façons de résoudre le problème.

(A) Modifiez la configuration defaultConnectionFactory:

<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"></defaultConnectionFactory>

(B) Utilisez une chaîne de connexion de configuration nommée et spécifiez explicitement le fournisseur:

<connectionStrings>
    <add name="MyDB" providerName="MySql.Data.MySqlClient" connectionString="server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123" />
</connectionStrings>

et changez le constructeur en 

public MyDB()
{
    // ...
}

ou si le nom est différent de votre nom de classe dérivée DbContext:

public MyDB() : base(connection_string_name)
{
    // ...
}

(C) Utilisez DbConfigurationTypeAttribute :

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyDB : DbContext
{
    // ...
}
6
Ivan Stoev

J'ai eu ce problème lors du développement d'une application Web sur Core 2. Je devais changer la connexion de base de données par défaut utilisée de SqlServer à MySql dans le fichier Startup.cs où l'application est configurée. 

 enter image description here

3
Vectoria

L'erreur similaire à celle répertoriée ci-dessus survient lorsque vous travaillez avec ASP.net core et Database. Le fournisseur de base de données par défaut avec le noyau ASP.net est SQL Server, mais si vous utilisez un autre fournisseur, PostgreSQL par exemple, sans écrire ou configurer correctement le code DBContext dans le fichier startup.cs. 

Par exemple - Le code suivant a été écrit dans l'intention de se connecter à PostgresSQL. Le résultat est une erreur ArgumentException: Mot clé non pris en charge: "port".

public void ConfigureServices (services IServiceCollection) { services.AddMvc (); var connection = @ "Serveur = localhost; Port = 5432; Base de données = NewDB; Utilisateur ID = xxxxx ; Mot de passe = cr @ aaaa; ""; Services.AddDbContext (options => options.UseSqlServer (connexion));

Et la raison est que l'utilisateur essaie de se connecter à PostgreSQL mais qu'il a changé l'option par défaut Option UseSQLServer après la configuration de la chaîne PostgreSQL. 

Pour résoudre le problème, changez l'option


options.UseSqlServer (connexion)) -> options.UseNpgsql (connexion))


0

J'ai définitivement résolu le problème en utilisant MySql Connector 8.0.x et les instructions suivantes sur ce lien: https://davidsekar.com/asp-net/mysql-error-the-provider-did-not-return-a-providermanifesttoken .

en détails:

  1. Installez MySql.Data.EntityFramework. N'installez pas Installez MySql.Data.Entity!

  2. Configurez web.config/app.config de cette manière:

    2.1. Remplacez la balise <entityFramework> par <entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">

    2.2. Ajouter/changer le fournisseur. Ce doit être: <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />

    2.3. La chaîne de connexion peut maintenant être server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123

  3. Ouvrez la classe de configuration de votre DbContext (si présente) et placez le code suivant dans son constructeur: SetSqlGenerator("MySql.Data.MySqlClient" new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator());

0