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 就算存储了?

大概就像这种代码:

s
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 入口程序,简单地添加几行测试代码:

s
class Program
{
    static void Main(string[] args)
    {
        using (EntityModelContainer em = new EntityModelContainer())
        {
            em.TUserSet.Add(new TUser()
            {
                UserName = "TestUser1",
                Password = "xxxx"
            });
            em.SaveChanges();
        }
    }
}

上述代码会在 TUserSet 表中增加一行数据,点击运行完毕,查看数据库的数据表。

可以看到条目已经成功添加。

连接数据库

# 读取

现在就可以再次测试读取:

方法依然简单:

s
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 上找到支持的)