我在VS 2017中建立了一个新项目。我的目的是使用EF CodeFirst方法。到目前为止,我使用的是Azure SQL数据库,而在这个测试项目中我想使用我的远程MySQL数据库。我创建了用户并且权限设置恰到好处。我可以通过MySQL Workbench访问这个远程数据库服务器。
我创建了一个新的空白MVC项目,并通过Nuget我安装了MySQL.Data.Entity(版本6.9.10)。
我的上下文类:
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class WebDb : DbContext
{
public WebDb() : base("WebDb")
{
}
public DbSet<Candidate> Candidates { get; set; }
}
我的web.config包含以下条目:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
我的连接字符串是:
<connectionStrings>
<add name="WebDb" providerName="MySql.Data.MySqlClient" connectionString="server=x.x.x.x;uid=dbuser;pwd=password;database=temp1;" />
</connectionStrings>
我有一个简单的域类
public class Candidate
{
public int Id { get; set; }
public string Name { get; set; }
}
当我给出Enable-Migrations -Force命令时,我得到了
检查上下文是否针对现有数据库... System.Data.Entity.Core.ProviderIncompatibleException:提供程序 没有返回ProviderManifestToken字符串。 ---&GT; MySql.Data.MySqlClient.MySqlException:无法连接到任何一个 指定的MySQL主机。在 MySql.Data.MySqlClient.NativeDriver.Open()at MySql.Data.MySqlClient.Driver.Open()at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder 设置) MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()at MySql.Data.MySqlClient.MySqlPool.GetConnection()at MySql.Data.MySqlClient.MySqlConnection.Open()at MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(的DbConnection 连接) System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(的DbConnection 连接)---内部异常堆栈跟踪结束--- at System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(的DbConnection 连接) MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(的DbConnection 连接) System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(的DbConnection 连接,DbProviderManifest&amp; providerManifest)at System.Data.Entity.DbModelBuilder.Build(的DbConnection providerConnection) 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()
1 writeXml)at System.Data.Entity.Utilities.DbContextExtensions.GetModel(的DbContext 上下文) System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration 配置,DbContext usersContext,DatabaseExistenceState presenceState,布尔名为ByBreateDatabase)at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration 配置) System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(DbMigrationsConfiguration migrationsConfiguration)at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore() 在System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 提供商未返回ProviderManifestToken字符串。
at System.Data.Entity.Internal.LazyInternalContext.get_ModelBeingInitialized() at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer) at System.Data.Entity.Utilities.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w) at System.Data.Entity.Utilities.DbContextExtensions.GetModel(Action
据我所知,我已经广泛搜索到无济于事。这里发生了什么事?我错过了什么?
答案 0 :(得分:13)
我最近遇到了和你一样的问题。一切都在SQL Server中运行良好,但我在转换到MySQL时遇到了很多问题。对我有用的一些事情是:
Install-Package MySQL.Data -Version 6.9.9
Install-Package MySql.Data.Entity -Version 6.9.10
MySQL的新8.0程序包似乎有问题。当我恢复到旧版本时,它有效。
您的app.config应如下所示:
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
</configuration>
即使在那之后,我发现MySQL中也存在一些差异。例如,您的迁移“索引”语句将不起作用。您必须编辑迁移文件并自行构建索引。我刚刚阅读但未遇到的另一件事是MySQL驱动程序不允许多个连接,这可能意味着改变了检索异步集合的方式。最后,我遇到RowVersion是byte []的问题。我使用了以下文章中的变体来解决这个问题(希望如此!)。
Better way to implement a row version with EF Core and MySQL?