こんにちは、CodeFirst Entity Frameworkである特定のDBに接続する複数のプロジェクトがあります。
1つの頑固なプロジェクトを除いて、すべてのプロジェクトは正常に接続できます。
私が取得しているエラーは次のとおりです:_Keyword not supported: 'port'
_
私は無数のスタックオーバーフローの質問、mysqlフォーラム、エンティティフレームワークフォーラムなどを調べてきました。
MappingException Edm.StringはSqlServer.varbinaryと互換性がありません
MySQLの接続文字列ではキーワードはサポートされていません
サポートされていないキーワード: 'メタデータ' + MySQL
接続文字列は次のようになります:_server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123
_
私のdb.csファイルは次のようになります:
_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);
}
}
_
接続文字列から_port:3306
_を削除すると、次のようになります: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
SQL ServerではなくMySql Connectorを使用しています...
これだけでなく、チームの他のメンバーにも完全に困惑しています。
編集:これは私の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>
_
使用されるベースの引数DbContext
constructor はnameOrConnectionString
と呼ばれます。したがって、構成ファイルからの接続文字列の名前など、実際の接続文字列をサポートしています。
後者の問題は、プロバイダー名を指定できないため、前者は構成からのものであり、その場合、EFは1つを使用しますdefaultConnectionFactory
構成要素で指定します。この場合はSystem.Data.Entity.Infrastructure.SqlConnectionFactory
、言い換えると-Sql Server、したがってport
はサポートされない例外です。
この問題を修正するにはいくつかの方法があります。
(A)defaultConnectionFactory
構成を変更します。
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"></defaultConnectionFactory>
(B)名前付き構成接続文字列を使用し、プロバイダーを明示的に指定します。
<connectionStrings>
<add name="MyDB" providerName="MySql.Data.MySqlClient" connectionString="server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123" />
</connectionStrings>
コンストラクタを次のように変更します
public MyDB()
{
// ...
}
または、名前がDbContext
派生クラス名と異なる場合:
public MyDB() : base(connection_string_name)
{
// ...
}
(C) DbConfigurationTypeAttribute
を使用:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyDB : DbContext
{
// ...
}
上記のエラーと同様のエラーは、ASP.netコアおよびデータベースでの作業中に発生します。 ASP.netコアを備えたデフォルトのデータベースプロバイダーはSQL Serverですが、PostgreSQLなどの別のプロバイダーを使用していて、startup.csでDBContextコードを正しく記述または構成していない場合
たとえば、次のコードはPostgresSQLに接続する目的で記述されているため、エラーになりますArgumentException:Keyword not supported: 'port'。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
var connection = @"Server=localhost;Port=5432;Database=NewDB;User Id=xxxxx;Password=cr@aaaa;";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
// ...
}
そして、その理由は、ユーザーがPostgreSQLに接続しようとしているが、PostgreSQL文字列の構成後にデフォルトのオプションUseSQLServerを変更したためです。
問題を修正するには、オプションを変更してください
options.UseSqlServer(connection))-> options.UseNpgsql(connection))
時にはそれが最も簡単なことです。私が接続文字列の先頭にある「Server =」を逃したとき、私のものはコピーアンドペーストエラーでした。
私はMySql Connector 8.0.xを使用してこのリンクの指示に従って問題を明確に解決しました: https://davidsekar.com/asp-net/mysql-error-the-provider-did-not-return-a -providermanifesttoken 。
詳細に:
MySql.Data.EntityFrameworkをインストールします。 Install MySql.Data.Entityはインストールしないでください。
このようにweb.config/app.configを構成します。
2.1。 _<entityFramework>
_タグを_<entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">
_に変更します
2.2。プロバイダーを追加/変更します。 _<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
_でなければなりません
2.3。接続文字列を_server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123
_にできるようになりました
DbContextの構成クラス(存在する場合)を開き、次のコードをそのコンストラクターに配置します:SetSqlGenerator("MySql.Data.MySqlClient" new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator());