使用指南
实体
创建并设计一个实体
您可以从零开始或从现有数据库表创建实体。
要从零开始创建实体,您可以选择 实体设计(从零开始)。
然后您可以根据实体创建数据库表。 每个实体将被创建为一张表。 字段设置将用于创建表架构。
要从现有数据库表创建实体,您可以使用 实体设计(基于数据库) 项。
然后您可以修改实体并创建新数据库或将更改迁移到现有数据库。
创建和设计实体时请注意以下事项:
数据库是在您生成项目并运行 Web API 项目后创建的。 默认情况下,将在 [project].WebApi 项目下创建 SQLite 数据库(数据库文件 data.db)。
数据库创建完成后,如果要对实体进行更改(包括添加/删除/修改字段或删除实体),可能会发生数据库冲突,数据操作可能失败。 您需要按照 实体更改后更新数据库 中的说明手动删除或迁移数据库。
例如,要添加一个基类实体:
步骤 1:右键单击设计项目节点并选择 添加 > 新建项。 在 添加新项 对话框中,选择 基类实体设计,指定实体名称,然后单击 创建。
步骤 2:在实体设计器中,单击 添加字段 以添加并指定字段设置。
基类实体可以包含其他实体中的常用字段。
字段名称 | 字段类型 | 字段设置 |
---|---|---|
ID | Int32 | 主键:选中 |
InsertTime | Compute | 表达式:UtcNow() 数据类型:DateTime 插入时执行:选中 |
UpdateTime | Compute | 表达式:UtcNow() 数据类型:DateTime 插入时执行:选中 更新时执行:选中 |
步骤 3:您可以打开 演示应用 中的 BaseEntity.sde 文件仔细查看这些设置。
再例如,添加一个实体(并从基类实体继承字段):
步骤 1:右键单击设计项目节点并选择 添加 > 新建项。 在 添加新项 对话框中,选择 实体设计(从零开始),指定实体名称(例如“Department”),然后单击 创建。
步骤 2:在实体设计器中,选择从基类实体继承,并选择 显示继承的字段 选项,以便基类实体中的字段以只读方式显示在字段列表中。
步骤 3:单击 添加字段 以添加并指定字段设置。
字段名称 | 字段类型 | 字段设置 |
---|---|---|
DepartmentName | String | 必填:选中 |
Company | Company | 集合:选中 映射到:Company |
SuperiorDepartment | Department | 可空:选中 |
步骤 4:在 服务与API设计 选项卡中,点击 添加基础服务 和 生成所有API,生成所有基础 API。
步骤 5:您可以打开 演示应用 中的 Department.sde 或 Employee.sde 文件仔细查看这些设置。
从实体生成数据库
创建实体后,您可以从这些实体自动生成数据库。
步骤 1:在设计项目中创建实体后,右键单击设计项目节点并选择 生成项目 > 配置文件。
默认情况下,将在 [project].WebApi 的根文件夹中创建本地 SQLite 数据库(data.db)。
您还可以在 配置文件 向导中创建或选择不同的数据库连接。
步骤 2:选择现有数据库连接或选择 新建 创建新的数据库连接。
步骤 3:保存配置文件,然后单击 生成项目 生成项目。
项目生成后会自动加载到解决方案中。
步骤 4:在 IDE 工具栏中,从项目列表中选择 [project].WebApi,然后单击 运行 来启动 Web API。
Web API 成功启动后,会自动生成数据库文件。
例如,默认情况下会在 [project].WebApi 的根文件夹下自动生成一个 SQLite 数据库(data.db)。 有关更多信息,请参阅 管理和更新数据库连接。
从数据库生成实体
请参阅 这个小节。
添加或修改实体中的字段
一旦数据库文件生成后(例如生成并运行 Web API),在现有实体中添加/删除/修改字段可能会导致数据库冲突(从而导致数据操作失败)。 在这种情况下,您需要按照 实体更改后更新数据库中的说明手动删除或迁移数据库。
如果您修改实体中的以下字段设置,则需要手动删除或迁移数据库,以便将这些更改包含在数据库架构中。
- 字段名称
- 字段类型
- 集合
- 可空
- 主键
- 列名称
- 列类型
- 设置并发检查
- 索引
- 索引 > 唯一
添加搜索字段(使用过滤器设计器)
要将搜索字段添加到应用程序:
步骤 1:在设计器中打开实体文件(我们使用 WeatherForecast 模板,直接打开 WeatherForecast.sde 文件)。
步骤 2:选择 过滤器设计 选项卡,然后单击 添加过滤器,然后指定过滤器的选项。
假如您想添加一个搜索字段,允许用户输入日期并搜索输入日期的温度,那么您应该指定如下设置:
(Date 参数和 WeatherForecast.DateTime 字段必须按类型匹配。例如,如果将 Date 参数设置为 DateOnly,则 WeatherForecast.DateTime 字段也必须设置为 DateOnly。)
步骤 3:选择 服务与 API 设计 选项卡,然后选择 添加服务 > 获取分页数据 > SearchByDate。
步骤 4:确保选中 生成 API 选项。
步骤 5:生成项目并运行 Web API。
使用继承策略
有三种继承策略可供选择:TPH 具有更好的查询性能,TPT 具有更高的存储效率,TPC 适用于不需要多表关联或查询的情况(从不或很少查询基类)。
要使用继承策略,您需要创建一个父实体(不能是基类实体类型)和一个子实体。
以 TPH 为例:
创建一个名为 TPHBase 的实体,然后选择 TPH 继承策略。
创建名为 TPH 的实体并选择 TPHBase 作为基类实体。
复合查询
创建复合查询
首先创建两个实体:Person 和 IDCard,这里使用一对一关系进行演示,每个人只有一张身份证,一张身份证只能被一个人所有。
Person 实体:
IDCard 实体:
然后创建一个复合查询:
- 右键点击项目然后选择 添加 > 新建项。
- 选择 复合查询设计。
- 选择 Person 和 IDCard 两个实体用于设计查询模型。
- 点击 创建。
设置关系
普通关联
在 IDCard 和 Person 中,将 IDCard 的 PersonID 字段和 Person 的 ID 字段建立关联,可以通过长按并拖拽鼠标把 PersonID 字段和 ID 字段连接起来。也可以在右侧的 关系设置 标签页中,添加实体和字段来建立关联。
选择两个实体的连接方式:Inner Join、Left Join、或 Right Join。
条件关联
在右侧的 关系设置 标签页中,输入表达式来进行关系设置。
设置分组
完成关系设置之后,我们可以进行分组,什么时候需要分组?这里的分组概念应该和数据库的保持一致,就是在使用聚合函数时,我们可以通过分组来统计不同组的数据:如统计男女人数,那么就需要按照性别进行分组,因为性别为男的人数和性别为女的人数需要分开显示,如果统计总人数那就不需要分组。
下面介绍两种分组模式。
字段分组
当选择字段分组时,可供选择的字段只能包含实体数据源的字段。
添加字段分组后,结果集字段会添加相应字段。就是同步会输出分组字段,如下图所示,这里要按性别统计男女人数(性别分组)。
表达式分组
除了字段分组,有时候还需要用表达式进行分组,以实现动态分组的效果,如下图所示。
例如:按年龄进行分组,20岁以下为青年,20岁到60岁为壮年,60岁以上是老年,并统计各个年龄段的人数,那么分组表达式如下图所示。
设置过滤条件
在完成复合查询的连接关系和分组设置之后,可以进行条件过滤设置。条件过滤设置和实体过滤器的使用方法一样,对实体的字段的值进行条件过滤,满足条件的进行查询,并且返回结果,不满足条件的不返回。例如:查询地址在深圳XX区的人的姓名和身份证号码,这样就需要对地址进行过滤。
注意:需要过滤的字段只能是数据源字段(不能选择输出结果集映射),如下图所示。
输出结果集映射
添加字段
场景一:对一个查询模型进行输出,需要设置查询字段。
如查询连接后但是没有进行分组的信息,如查询出(地址、姓名、年龄)来自不同的实体,如下图所示。
场景二:对分组和连接的结果统计。
分组过后,可供选择字段如下图所示。
Group
Group 和 EF Core 框架保持一致,Group.key 是用户分组的字段。如果表达式只选择 key 下面的某一个字段进行输出,那么输出的就是分组字段。
Group 中的实体 Person 和 IDcard 是分组后的数据源,它们都是集合,例如要统计男女生人数可以如下图所示,输入表达式统计 Group 下面的分组数据源,就可以统计出男生人数和女生人数。
QueryItems
QueryItems 中的数据源可以满足一部分需求,提供更加灵活的统计。QueryItems 其实是一个连接后未分组的结果集。
例如,为了统计男女比例,需要先统计总人数。这种情况下,不要使用 Group 下面的 Person,应该使用 QueryItems 下面的 Person(表示已连接并且未分组的数据),这时候 Count(Person) 就是总人数。
枚举
枚举就是实体设计的枚举字段。在写表达式时可以引用枚举,减少字符串在代码中的频率。使用枚举生成的代码更加规范。
添加计算列
计算列可以对输出结果集进行进一步处理。
上面我们统计了分组的人数和总人数,接下来我们通过一个计算列来统计男女占比(男生人数或者女生人数/总人数)。
项目
修改生成的项目
不建议直接修改生成的项目,因为这些项目在每次执行生成项目时都会自动生成。 如果您直接对自动生成的文件进行更改,则下次再次生成项目时,更改将被覆盖。
如果您想将自己的脚本添加到生成的项目中,可以考虑以下选项:
- 添加自定义代码。
- 创建一个新项目并将脚本放入新项目中,并在该新项目和自动生成的项目之间进行引用。
- 在生成的项目中创建一个新的类文件,并将脚本放入新的类文件中。