本案例主要是基于 Visual 2022 实现 EF框架与 MySql 数据库的开发应用,采用的是 CodeFirst 模式实现。MySql 数据库版本是 8.0.28,案例用的版本也是这个版本,
当然也可以去官网下载 https://dev.mysql.com/downloads/installer/
最新版本的数据库安装。
(相关资源可在结链接处下载)
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
{
///
/// 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; }
}
}
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