ADO.NET 是微软提供的一种对数据库方便操作的功能,实体框架 EF6 (Entity Framework 6) 应当属于其中子集。
# 简介
以下为微软官方的介绍:
# ADO.NET
ADO.NET 是一组向 .NET Framework 程序员公开数据访问服务的类。 ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件。 它提供了对关系数据、XML 和应用程序数据的访问,因此是 .NET Framework 中不可缺少的一部分。 ADO.NET 支持多种开发需求,包括创建由应用程序、工具、语言或 Internet 浏览器使用的前端数据库客户端和中间层业务对象。
# Entity Framework 6
实体框架 6 (EF6) 是经试验和测试的关系映射器 (O/RM),适用于 .NET 的对象,其功能和稳定性经过了多年的开发和调试。
注:同类还包括 EF Core,根据官方文档,似乎相比 EF6,更推荐 EF Core。
目前这篇文章,之所以写这个流程,主要是昨天一个网友发给我一个网友做的游戏开源项目,那是一个网络类游戏 Demo,数据库使用的 SQLserver,就用到了这个模型。
抱着学习学习的心态,于是看了下代码,并且想跑跑看,于是运行了起来,不过在执行到新建账号那些操作数据相关内容的时候就一直报错。
当时一开始根本没看到哪里有具体操作数据库的,只看到使用 linq 直接直接读取列表,改完 SaveChanges 就算存储了?
大概就像这种代码:
TUser user = DBService.Instance.Entities.Users.Where(u => u.Username == request.User).FirstOrDefault(); | |
if(user==null) | |
{ | |
DBService.Instance.Entities.Users.Add(new TUser() | |
{ | |
Player = new TPlayer(), | |
Username = request.User, | |
Password = request.Passward | |
}); | |
DBService.Instance.Entities.SaveChanges(); | |
} |
注:DBService 是个单例,单纯缓存了 Entities 的实例而已,几乎没有任何其他什么代码。
数据库操作有这么简单?不要唬我,就感觉一脸懵逼。后边才明白过来,感情是用了框架,所以都被封装简化了。
项目最近难得没有忙天忙地,自己有空在研究网络这块,还想自己搞个游戏的网络框架玩玩,这么简单的数据库操作方式,不拿来用用怎么行?
于是又研究了下相关使用,查了下官方文档,研究了一番跑了起来 —— 虽然最终发现 Demo 就不完整,运行出来依然有缺失。
不过至少这种数据库的使用方式算是 Get 到了,后面可以考虑用起来,先在此记录一下。
# 使用
运行上述网友 Demo 就不提了,这里说的使用指的从头开始创建,然后简单测试使用的流程。
- Model First 模型:直接使用设计器设计数据库关系图,生成代码使用。
- Code First 模型:代码描述实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。
注:本文的流程基于使用 ModelFirst 模型,对 CodeFirst 模型又兴趣的的可以看官方文档教程
# 创建项目
首先,打开 Visual Studio,创建一个控制台项目:
个人使用的 VS2019。
这里将项目命名为 AdoNetProject:
# 创建 Ado.Net 实体数据模型
项目创建完成后,首先在根目录新建一个 DataSources 目录,当然命名什么都看自己,都是自定义。
之所以新建文件夹,主要是后续生成代码会在 Ado.Net 实体数据模型的同一个目录,如果就直接放在根目录下的话,就会凭空多出很多生成后的『.cs』文件。
虽然在 VS 项目中会被整理到.edmx 下,不过在实际目录中,是与其同级存在的。这里避免根目录出现太多散代码文件,最好归档。
接着右键新建的目录,添加 -> 新建项,选择 ADO.NET 实体数据类型,这里个人将其命名为 EntityModel
在开启模型向导界面选择 空 EF 设计器模型。
注:Code First 模型根据介绍,用于基于代码的映射,这里因为写设计器模型,就不提了。
创建完毕后,在 VS 中继续双击文件可以打开编辑界面。
# 添加测试实体
在空白处右键, 新增 -> 实体:
这里个人命名为 TUser,并增加了 UserName 字段。
# 添加 EF 代码自动生成
创完毕后,继续右键 『添加代码生成项』,使其可以自动生成模型相关代码,选择 EF6.X DbContext 生成器
这时,代码就会根据上面创建的实体自动生成了,VS 自动刷新后,就可以在创建的 edmx 文件下看到了。
后续当设计器上发送修改,并保存后,代码也会自动同步更新。
此时已经可以写代码了,不过使用的话,还差最后一步 —— 也就是创建数据库连接。
# 生成数据库
继续在生成器空白处点击右键,选择 『根据模型生成数据库』,在弹出页面选择新建连接:
然后在数据源中选择 SQLServer 数据库文件,确认进入下一页。
这里之所以如此选择,是因为个人并未单独安装 Sql 数据库,如果有安装独立数据库,则也可以选择另外的方式
数据库文件名 选项中点击浏览,并选择一个保存数据库文件的位置 (如果有对应的老数据库就可以直接选择老数据库了,前提是两者配得起来)
如果是新建数据库,那么可以起一个名字。如图所述,这里命名为 AdoNetProjectData
点击确定,如果是不存在的数据库文件,则会提示是否新建,确定即可。
点击下一步,会自动生成一堆用于初始化数据库的 SQL 代码并预览。
一般情况下,直接点击完成。
这时如果勾选了上一步的保存连接字符串 (默认勾选),数据库连接字符串就会被保存在 App.config 的 connectionStrings 中。
# 执行数据库初始化
接下来,是连接数据库,并执行上一步所生成的 SQL 代码。
此时有两种方式可以实现:
# 1. 复制 SQL 代码执行
点击菜单栏的 工具 -> 连接数据库
数据库文件名选择上述步骤所建立的文件,点击测试连接,应当会显示连接成功的提示:
点击确定即连接成功。
右键连接成功的数据库,选择『新建查询』,然后将之前自动生成的 SQL 代码复制进取,点击运行。
# 2. 直接执行 SQL 代码
打开自动生成的 SQL 代码,可以发现左上角有个三角形运行符号,点击后连接,然后将旁边的目标选择为上述添加的数据库文件路径,再点击运行。
运行时可能会出现如下错误:
注释代码 USE[模型名字]
,重新运行即可,例如下所示:
SET QUOTED_IDENTIFIER OFF;
GO
--USE [AdoNetProjectData];
--GO
IF SCHEMA_ID(N'dbo') IS NULL EXECUTE(N'CREATE SCHEMA [dbo]');
GO
若执行成功,数据库中将会生成对应的表:
现在配置流程结束,接下来就可以使用了。
# 测试代码
# 添加
因为我们创建的是一个控制台程序,此时回到 Program 入口程序,简单地添加几行测试代码:
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
using (EntityModelContainer em = new EntityModelContainer()) | |
{ | |
em.TUserSet.Add(new TUser() | |
{ | |
UserName = "TestUser1", | |
Password = "xxxx" | |
}); | |
em.SaveChanges(); | |
} | |
} | |
} |
上述代码会在 TUserSet 表中增加一行数据,点击运行完毕,查看数据库的数据表。
可以看到条目已经成功添加。
# 读取
现在就可以再次测试读取:
方法依然简单:
static void Main(string[] args) | |
{ | |
using (EntityModelContainer em = new EntityModelContainer()) | |
{ | |
TUser user = em.TUserSet.Find(1); | |
if (user != null) | |
Console.WriteLine(user.UserName); | |
user = em.TUserSet.Where((x) => x.UserName == "TestUser1").FirstOrDefault(); | |
if (user != null) | |
Console.WriteLine(user.UserName); | |
Console.ReadKey(); | |
} | |
} |
正常输出。
# 结束
以上便是整个流程了,除了使用前的配置稍微有点麻烦,使用方法可真是简单惨了。
本文描述了一个最简单的使用流程,以 EF 设计器模型为例,使用 SQLserver 数据库的方式,因为这是自带的 —— 不用过多的额外设置。
但是除此之外,它还是支持其它诸多数据库的,不过需要些额外操作就是了。
具体可以参看官方文档:支持列表
(链接接似乎是 EF Core,不过不要在意细节,EF6 一般也是能在 NuGet 上找到支持的)