编程语言界的丐帮 C#.NET FRAMEWORK 4.6 EF 连接MYSQL
1.nuget 引用 EntityFramework 、和 MySql.Data.EntityFramework。
EntityFramework 版本:6.4.4,
MySql.Data.EntityFramework 版本:8.0.30。
下载 MySql.Data.EntityFramework 时会自动 下载 MySql.Data 这个库。
2.新建实体类:
using System; using System.ComponentModel.DataAnnotations; namespace DbEfTest { public class sys_user { [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //设置自增 public long id { get; set; } public string user_name { get; set; } public string real_name { get; set; } public string password { get; set; } public string remark { get; set; } public string create_userid { get; set; } //public string UpdateUserid { get; set; } public DateTime create_time { get; set; } public DateTime? update_time { get; set; } } }
3.新建DbContext:
using System.Data.Entity; namespace DbEfTest { public class EfTestDbContext : DbContext { public EfTestDbContext() : base("EfTestDbContext") { } public DbSet<sys_user> sys_user { get; set; } } }
4.检查Web.config 或 app.config
4.1 检查 entityFramework - providers 配置节(这里是nuget 自动生成的),有没有:
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
没有则加上。
4.2 检查 system.data - DbProviderFactories 配置节(一般需要手动加上的),有没有:
<!-- 这里是 手动加上的 --> <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=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> </DbProviderFactories> </system.data>
没有则加上。
实测providers 和 DbProviderFactories中,不加上“, Version=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d” 也能正常跑。
也可以不加“<remove invariant="MySql.Data.MySqlClient" />”。
4.3 连接字符串:
<connectionStrings> <add name="EfTestDbContext" connectionString="Data Source=127.0.0.1; port=3306;Database=entityframework_test;uid=root;pwd=some111;" providerName="MySql.Data.MySqlClient" /> </connectionStrings>
完整配置代码示例:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/> </startup> <connectionStrings> <add name="EfTestDbContext" connectionString="Data Source=192.168.5.115; port=3306;Database=db3;uid=jojo;pwd=Gameking2008#;" providerName="MySql.Data.MySqlClient"/> </connectionStrings> <entityFramework> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/> <!-- 这里是nuget 自动生成的 --> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.30.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=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> </DbProviderFactories> </system.data> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
5.使用代码:
using (EfTestDbContext db = new EfTestDbContext()) { var tm1 = db.sys_user.FirstOrDefault(x => x.id == 1); if (tm1 != null) { first = tm1.real_name; } }
6.编译后,检查 bin 目录(网站)或根目录(EXE程序)是否存在MySql.Data.EntityFramework.dll 文件。
如果没有,则要到 https://downloads.mysql.com/archives/c-net/ 去下载 Connector 并安装。Connector 要与 nuget 引用的版本一致,例如配置文件里 :Version=8.0.30.0,就得下载相应版本的Connector。
然后到安装目录:C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.30\Assemblies\v4.5.2,找到 MySql.Data.EntityFramework.dll,复制到bin目录或根目录。
7.运行程序。
可能遇到的问题:
The ADO.NET provider with invariant name 'MySql.Data.MySqlClient' is either not registered in the machine or application config file, or could not be loaded. See the inner exception for details. inner ex:找不到请求的 .Net Framework Data Provider。可能没有安装。
解决方法:
要在 DbProviderFactories 配置节中加 <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
--