作为EF noob,我试图将Entity Framework 6 Code First与我在开发计算机上安装的MySql Server 5.6一起使用。
我做了一个非常小的测试控制台项目。我添加了NuGet包:
我的App.config看起来像这样:
<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"></provider>
</providers>
</entityFramework>
A有两个类:
MyContext:
public class MyContext : DbContext
{
public MyContext(DbConnection connection)
: base(connection, true)
{
}
public DbSet<MyEntity> MyEntities { get; set; }
}
myEntity所:
public class MyEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
我的主要方法如下:
static void Main(string[] args)
{
using (MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=calibrationtest;Uid=calibration;Pwd=*******"))
{
using (MyContext context = new MyContext(conn))
{
context.MyEntities.Add(new MyEntity()
{
Name = "1234"
});
context.SaveChanges();
}
}
}
当我运行它时,我得到一个System.NotSupportedException:
无法确定类型的提供程序工厂的提供程序名称 'MySql.Data.MySqlClient.MySqlClientFactory'。确保 ADO.NET提供程序已在应用程序配置
中安装或注册
我尝试将MySql.Data.MySqlClient.MySqlClientFactory添加到App.config中:
<provider invariantName="MySql.Data.MySqlClient.MySqlClientFactory" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"></provider>
然后我到达了Entity.Core Bug:
实体框架提供程序类型的“实例”成员 'MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version = 6.8.3.0, Culture = neutral,PublicKeyToken = c5687fc88969c44d'没有返回一个对象 继承自'System.Data.Entity.Core.Common.DbProviderServices'。
我做错了什么?
修改
我尝试删除NuGet包(MySql.Data和MySql.Data.Entities.EF6)
然后我安装了新版本directly from MySql,现在上面的测试代码成功运行了吗?
答案 0 :(得分:7)
你必须保留两个配置部分, 像这样
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" description=".Net Framework Data Provider for SQLite" invariant="System.Data.SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="MySql.Data.MySqlClient" /><add name="MySQL" description="ADO.Net driver for MySQL" invariant="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"/>
</DbProviderFactories>
</system.data>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.SQLiteProviderServices, System.Data.SQLite.Linq, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
</providers>
</entityFramework>
答案 1 :(得分:2)
我也在使用EF6.1收到此错误:
无法确定类型为&#39; MySql.Data.MySqlClient.MySqlClientFactory&#39;的提供程序工厂的提供程序名称。确保在应用程序配置中安装或注册了ADO.NET提供程序。
原来是因为绑定重定向引用了不支持EF6的旧版MySQL.Data(6.7.4)。我把它改成后:
<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>
</assemblyBinding>
错误消失了。
答案 2 :(得分:0)
我遇到了完全相同的问题。 通过使用以下NuGet包管理以修复它:
EntityFramework 6.1.0
MySql.ConnectorNET.Data 6.8.3.2
MySql.ConnectorNET.Entity 6.8.3.2
答案 3 :(得分:0)
我有这个异常,但是我的规格是EF6.2 My Sql Connector和EF Extender v8.0.13.0,但看起来却一样。我有类似的连接/ dbcontext策略,因为我们在ORA,Sql Serv和MySql之间切换。我在端点配置文件中添加了以下部分,它开始起作用
<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" />
<!-- ADDED THIS (below) -->
<provider invariantName="MySql.Data.MySqlClient"
type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.13.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
</entityFramework>
<runtime>
<assemblyBinding>
<!-- ADDED THIS (below) -->
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.13.0" newVersion="8.0.13.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
请注意,如果您已对应用程序进行了分层,并且在较低层中引用了EF,则在添加软件包时,它将把这些条目添加到app.config
中。但是DLL并不是终点,因此您需要将这些设置手动传播到web.config
中(如果终点是Web应用程序)。或者,您可以将同一包添加到终点。这取决于您的体系结构。就我而言,我们试图在不需要时不添加软件包。但是,如果直接在调用程序集中使用EF的功能,则无论如何都需要引用EF。这里的主要内容-确保端点*.config
包含这些设置