[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例
主要实现了 EF框架 Code First 模式在 MySql 中的实现,使用WPF项目开发,包括启用迁移、增加迁移和更新数据库等操作
MySql+EF6的CodeFirst模式案例实现
一、总体描述
本案例主要是基于 Visual 2022 实现 EF框架与 MySql 数据库的开发应用,采用的是 CodeFirst 模式实现。MySql 数据库版本是 8.0.28,案例用的版本也是这个版本,
当然也可以去官网下载 https://dev.mysql.com/downloads/installer/
最新版本的数据库安装。
二、VS2022环境准备
1、创建WPF项目
- 打开VS2022,新建项目 EFDemo。
- 项目创建完成后如下所示:
- WPF项目创建完成后,我们再新建一个 EF.Models 类库,用来单独实现整个的数据库操作。项目只需要引用这个类库即可实现数据库操作。新建 EF.Models 类库步骤如下所示:
这里我们删除默认生成的 Class1。
2、依赖说明
- MySql.Data.Entity 安装 MySql.Data.Entity 依赖包(旧版本(6.10.9.0 )在VS2022的NuGet中已经搜不到了)。
- MySql.Data 安装 MySql.Data 框架包(太早版本(6.10.9.0 )在VS2022的NuGet中已经搜不到,最新的在8.0以上了,一定要保持与MySql.Data.Entity EF框架包版本一致,该依赖包在安装过程随着MySql.Data.Entity 依赖包安装会自动安装)。
3、依赖安装
(相关资源可在结链接处下载)
- 拷贝依赖包到项目文件夹下 安装 MySql.Data 框架包(太早版本(6.10.9.0 )在VS2022的NuGet中已经搜不到,最新的在8.0以上了,一定要保持与MySql.Data.Entity EF框架包版本一致,该依赖包在安装过程随着MySql.Data.Entity 依赖包安装会自动安装)
- 创建本地包安装源 由于依赖包版本比较老。VS2022上NuGet包直接搜基本搜不到了,需要下载到本地进行安装。按照上面 1 的操作后在NuGet管理解决方案包中添加本地程序包源路径,如下图所示进行操作。
- 安装本地依赖,联网状态 以上操作后会产生3个包源,点击程序包源选择全部。点击浏览项,搜索 MySql.Data ,点击选中 MySql.Data.Entity ,选择 EF.Models 项目进行安装。如下图所示:
安装完成后引用目录如下所示:
只需要安装 MySql.Data.Entity EF ,MySql.Data依赖包自动安装,这里要注意,千万不要升级MySql.Data 版本,目前这个旧版本是找不到的,升级了会导致整个框架配置不匹配,无法连接MySql数据库,安装完成后会自动生成 App.config 文件,如下所示,添加 Mysql 数据库连接 MyContext,其中 server=数据库地址;port=数据库默认端口;uid=用户;pwd=密码;database=数据库名称;Character Set=utf8 。
<connectionStrings>
<add name="MyContext" connectionString="server=127.0.0.1;port=3306;uid=root;pwd=123456;database=efdemo;Character Set=utf8" 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>
<connectionStrings>
<add name="MyContext" connectionString="server=127.0.0.1;port=3306;uid=root;pwd=123456;database=efdemo;Character Set=utf8" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>
<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.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider></providers>
</entityFramework>
</configuration>
4、安装数据库,这里大家下载安装包自行安装,相关资源可在结链接处下载
三、创建数据库实体模型类和数据库连接操作类
1、创建相关文件夹 EF.DLL 存放数据库操作类 和 EF.Entities 存放数据库表实体模型类。创建完成后如下所示:
2、EF.DLL 文件下新建 DataBaseContext 类,主要实现 连接数据库和映射数据库表实体模型类,每次新增表都需要在该类下配置相应的表名称。DataBaseContext 文件如下:
using EF.Models.EF.Entities;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace EF.Models.EF.DLL
{
/// <summary>
/// orm上下文
/// </summary>
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class DataBaseContext : DbContext
{
/// <summary>
/// 添加构造函数,name为config文件中数据库连接字符串的name,构造函数为无参构造函数,否则无法启用迁移命令
/// </summary>
public DataBaseContext() : base("MyContext")
{
base.Database.CreateIfNotExists();
}
#region 数据集
//示范
public DbSet<UserTable> userTable { get; set; }
#endregion
#region Fluent API配置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//移除自动建表时自动加上s的复数形式
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<UserTable>();
}
#endregion
}
}
3、EF.Entities 文件夹中创建表结构类,如下,以 usertable 表为例先创建 UserTable 类,先添加引用 using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;,编写表中相关字段。类如下所示:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EF.Models.EF.Entities
{
public class UserTable
{
/// <summary>
/// 按照时间生成
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[StringLength(128)]
public string id { get; set; }
/// <summary>
/// 账号
/// </summary>
[StringLength(100)]
public string useraccount { get; set; }
/// <summary>
/// 密码
/// </summary>
[StringLength(100)]
public string userpwd { get; set; }
/// <summary>
/// 用户名
/// </summary>
[StringLength(100)]
public string username { get; set; }
/// <summary>
/// 用户描述
/// </summary>
[StringLength(100)]
public string userdesc { get; set; }
/// <summary>
/// 角色id
/// </summary>
[StringLength(100)]
public string rolekey { get; set; }
/// <summary>
/// 创建人
/// </summary>
[StringLength(100)]
public string createpeople { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime creattime { get; set; }
/// <summary>
/// 更新人
/// </summary>
[StringLength(100)]
public string updatepeople { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime updatetime { get; set; }
}
}
四、EF 命令迁移创建、更新数据库
1、开始使用EF迁移数据库指令创建数据库和表结构,打开程序包管理控制台:
2、选择默认项目为 EF.Models
3、Enable-Migrations 启用数据库迁移,这时候程序自动生成 Migrations 迁移文件夹,这里要注意修改 迁移文件是否存在引用错误。AutomaticMigrationsEnabled = true 表示自动启用迁移,程序运行时会自动更新数据库保证数据库与程序版本一致。
4、Add-Migration + 自定义版本号 创建 数据库和 usertable 表。
这时候可以看到 usertable 表已经创建好了。
报错解决:【1】System.ArgumentException: 从索引 0 处开始,初始化字符串的格式不符合规范。
以上报错由于 EFDemo 项目的 App.config 中未添加数据库连接配置。按照下图配置即可解决报错。
原因:EFDemo 才是程序的启动方案,然后调用EF.Models 类库执行,优先读取 EFDemo 的 App.config。
【2】报错信息如下
[ArgumentNullException: 值不能为空。
参数名: type]
System.Activator.CreateInstance(Type type, Boolean nonPublic) +2796659
System.Web.Profile.ProfileBase.CreateMyInstance(String username, Boolean isAuthenticated) +76
System.Web.Profile.ProfileBase.Create(String username, Boolean isAuthenticated) +312
System.Web.HttpContext.get_Profile() +89
MasterPage_AdminMasterPage.get_Profile() +14
MasterPage_AdminMasterPage.bindMenu() +13
MasterPage_AdminMasterPage.Page_Load(Object sender, EventArgs e) +196
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Control.LoadRecursive() +131
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061
解决方案:1、检查配置文件,这里要注意的是检查的是数据库执行类库的配置,如果你的数据库操作类库属于项目文件夹下,那么就是检查项目的配置文件,否则检测数据库类的配置文件,查看数据库连接是否正确,连接所对应的地址是否存在数据库;3、打开Nuget管理,检查已安装的 MyDql.Data.Entity 依赖包说明,查看对应的依赖项版本是都一致。修改不一致的依赖包可解决。
5、更新数据表字段
如果后期需要对表结构修改,直接修改表的类字段,比如现在修改 UserTable ,新增性别字段 public int age { get; set; },然后执行 Update-Database
五、总结
本次案例仅代表个人自行实践获得,供大家参考学习,主要实现了 EF框架 Code First 模式在 MySql 中的实现,包括启用迁移、增加迁移和更新数据库等操作。后续继续使用该案例实现延开发完整的 WPF项目,如果觉得对你有帮助,可点击收藏。谢谢大家。
相关资源下载链接:
依赖包下载:MySql.Data.Entity 6.10.9.0 版本 +MySql.Data 6.10.9.0 版本
Mysql 版本 8.0.28
更多推荐
所有评论(0)