一、总体描述

本案例主要是基于 Visual 2022 实现 EF框架与 MySql 数据库的开发应用,采用的是 CodeFirst 模式实现。MySql 数据库版本是 8.0.28,案例用的版本也是这个版本,在这里插入图片描述

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

二、VS2022环境准备

1、创建WPF项目

  1. 打开VS2022,新建项目 EFDemo。
    在这里插入图片描述
  2. 项目创建完成后如下所示:
    在这里插入图片描述
  3. WPF项目创建完成后,我们再新建一个 EF.Models 类库,用来单独实现整个的数据库操作。项目只需要引用这个类库即可实现数据库操作。新建 EF.Models 类库步骤如下所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里我们删除默认生成的 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 依赖包安装会自动安装)在这里插入图片描述
  2. 创建本地包安装源 由于依赖包版本比较老。VS2022上NuGet包直接搜基本搜不到了,需要下载到本地进行安装。按照上面 1 的操作后在NuGet管理解决方案包中添加本地程序包源路径,如下图所示进行操作。在这里插入图片描述在这里插入图片描述
  3. 安装本地依赖,联网状态 以上操作后会产生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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐