[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例

MySql+EF6的CodeFirst模式案例实现

    • 一、总体描述
    • 二、VS2022环境准备
      • 1、创建WPF项目
      • 2、依赖说明
      • 3、依赖安装
    • 三、创建数据库实体模型类和数据库连接操作类
    • 四、EF 命令迁移创建、更新数据库
    • 五、总结

一、总体描述

本案例主要是基于 Visual 2022 实现 EF框架与 MySql 数据库的开发应用,采用的是 CodeFirst 模式实现。MySql 数据库版本是 8.0.28,案例用的版本也是这个版本,[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第1张图片

当然也可以去官网下载 https://dev.mysql.com/downloads/installer/
最新版本的数据库安装。

二、VS2022环境准备

1、创建WPF项目

  1. 打开VS2022,新建项目 EFDemo。
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第2张图片
  2. 项目创建完成后如下所示:
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第3张图片
  3. WPF项目创建完成后,我们再新建一个 EF.Models 类库,用来单独实现整个的数据库操作。项目只需要引用这个类库即可实现数据库操作。新建 EF.Models 类库步骤如下所示:
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第4张图片
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第5张图片
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第6张图片
    [EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第7张图片
    这里我们删除默认生成的 Class1。

2、依赖说明

  1. MySql.Data.Entity 安装 MySql.Data.Entity 依赖包(旧版本(6.10.9.0 )在VS2022的NuGet中已经搜不到了)。
  2. MySql.Data 安装 MySql.Data 框架包(太早版本(6.10.9.0 )在VS2022的NuGet中已经搜不到,最新的在8.0以上了,一定要保持与MySql.Data.Entity EF框架包版本一致,该依赖包在安装过程随着MySql.Data.Entity 依赖包安装会自动安装)。

3、依赖安装

(相关资源可在结链接处下载)

  1. 拷贝依赖包到项目文件夹下 安装 MySql.Data 框架包(太早版本(6.10.9.0 )在VS2022的NuGet中已经搜不到,最新的在8.0以上了,一定要保持与MySql.Data.Entity EF框架包版本一致,该依赖包在安装过程随着MySql.Data.Entity 依赖包安装会自动安装)[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第8张图片
  2. 创建本地包安装源 由于依赖包版本比较老。VS2022上NuGet包直接搜基本搜不到了,需要下载到本地进行安装。按照上面 1 的操作后在NuGet管理解决方案包中添加本地程序包源路径,如下图所示进行操作。[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第9张图片[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第10张图片
  3. 安装本地依赖,联网状态 以上操作后会产生3个包源,点击程序包源选择全部。点击浏览项,搜索 MySql.Data ,点击选中 MySql.Data.Entity ,选择 EF.Models 项目进行安装。如下图所示:[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第11张图片[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第12张图片[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第13张图片[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第14张图片
    安装完成后引用目录如下所示:[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第15张图片
    只需要安装 MySql.Data.Entity EF ,MySql.Data依赖包自动安装,这里要注意,千万不要升级MySql.Data 版本,目前这个旧版本是找不到的,升级了会导致整个框架配置不匹配,无法连接MySql数据库,安装完成后会自动生成 App.config 文件,如下所示,添加 Mysql 数据库连接 MyContext,其中 server=数据库地址;port=数据库默认端口;uid=用户;pwd=密码;database=数据库名称;Character Set=utf8 。
  
    
  


  
    
    

4、安装数据库,这里大家下载安装包自行安装,相关资源可在结链接处下载

三、创建数据库实体模型类和数据库连接操作类

1、创建相关文件夹 EF.DLL 存放数据库操作类 和 EF.Entities 存放数据库表实体模型类。创建完成后如下所示:
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第16张图片
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
{
    /// 
    /// orm上下文
    /// 
    [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class DataBaseContext : DbContext
    {
        /// 
        /// 添加构造函数,name为config文件中数据库连接字符串的name,构造函数为无参构造函数,否则无法启用迁移命令
        /// 
        public DataBaseContext() : base("MyContext")
        {
            base.Database.CreateIfNotExists();
        }

        #region 数据集
        //示范
        public DbSet userTable { get; set; }

        #endregion
        #region Fluent API配置
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //移除自动建表时自动加上s的复数形式
            modelBuilder.Conventions.Remove();
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity();
        }
        #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
    {
        /// 
        /// 按照时间生成
        /// 
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [StringLength(128)]
        public string id { get; set; }
        /// 
        /// 账号
        /// 
        [StringLength(100)]
        public string useraccount { get; set; }
        /// 
        /// 密码
        /// 
        [StringLength(100)]
        public string userpwd { get; set; }

        /// 
        /// 用户名
        /// 
        [StringLength(100)]
        public string username { get; set; }

        /// 
        /// 用户描述
        /// 
        [StringLength(100)]
        public string userdesc { get; set; }

        /// 
        /// 角色id
        /// 
        [StringLength(100)]
        public string rolekey { get; set; }

        /// 
        /// 创建人
        /// 
        [StringLength(100)]
        public string createpeople { get; set; }

        /// 
        /// 创建时间
        /// 
        public DateTime creattime { get; set; }

        /// 
        /// 更新人
        /// 
        [StringLength(100)]
        public string updatepeople { get; set; }

        /// 
        /// 更新时间
        /// 
        public DateTime updatetime { get; set; }
    }
}

四、EF 命令迁移创建、更新数据库

1、开始使用EF迁移数据库指令创建数据库和表结构,打开程序包管理控制台:
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第17张图片
2、选择默认项目为 EF.Models
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第18张图片
3、Enable-Migrations 启用数据库迁移,这时候程序自动生成 Migrations 迁移文件夹,这里要注意修改 迁移文件是否存在引用错误。AutomaticMigrationsEnabled = true 表示自动启用迁移,程序运行时会自动更新数据库保证数据库与程序版本一致。
在这里插入图片描述
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第19张图片

4、Add-Migration + 自定义版本号 创建 数据库和 usertable 表。
在这里插入图片描述
在这里插入图片描述
这时候可以看到 usertable 表已经创建好了。

报错解决:【1】System.ArgumentException: 从索引 0 处开始,初始化字符串的格式不符合规范。
以上报错由于 EFDemo 项目的 App.config 中未添加数据库连接配置。按照下图配置即可解决报错。
原因:EFDemo 才是程序的启动方案,然后调用EF.Models 类库执行,优先读取 EFDemo 的 App.config。
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第20张图片
【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 依赖包说明,查看对应的依赖项版本是都一致。修改不一致的依赖包可解决。
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第21张图片
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第22张图片[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第23张图片

5、更新数据表字段
如果后期需要对表结构修改,直接修改表的类字段,比如现在修改 UserTable ,新增性别字段 public int age { get; set; },然后执行 Update-Database
在这里插入图片描述
[EF]VS2022+MySql+EF6 CodeFirst模式实现 WPF案例_第24张图片

五、总结

本次案例仅代表个人自行实践获得,供大家参考学习,主要实现了 EF框架 Code First 模式在 MySql 中的实现,包括启用迁移、增加迁移和更新数据库等操作。后续继续使用该案例实现延开发完整的 WPF项目,如果觉得对你有帮助,可点击收藏。谢谢大家。
相关资源下载链接:
依赖包下载:MySql.Data.Entity 6.10.9.0 版本 +MySql.Data 6.10.9.0 版本
Mysql 版本 8.0.28

你可能感兴趣的:(WPF,wpf,mysql,数据库,EF-CodeFirst)