From 4a23464b967ce9638d66f2a2f59582b39492694b Mon Sep 17 00:00:00 2001 From: YuChen Date: Wed, 19 Mar 2025 17:40:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[shengchengqi]=E7=9A=84=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vuepress-starter/docs/shengchengqi.md | 102 ++++++++++++++++---------- 1 file changed, 64 insertions(+), 38 deletions(-) diff --git a/vuepress-starter/docs/shengchengqi.md b/vuepress-starter/docs/shengchengqi.md index ad56367..2ddffb1 100644 --- a/vuepress-starter/docs/shengchengqi.md +++ b/vuepress-starter/docs/shengchengqi.md @@ -1,26 +1,37 @@ # 代码生成器 ## 库表管理 + 库表管理页面是直接映射数据库的。 + +`CodeFirst`:代码优先;开发者先编写代码(领域模型的类),由代码实体生成数据库接口。对应的有 `DbFirst`与之相反。 + 也就是说 -``` csharp + +```csharp 库表管理==数据库 ??后台Entity ``` + ![alt text](./images/shengchengqi/01.png) 我们以建立一个简单的题库为例。 -新建了`App_TiKu`表,并添加了`LeiXing`(类型)、`TiGan`(题干)、`TiMu`(题目)、`DaAn`(答案)字段。点击保存后,数据库会同步创建表。 +新建了 `App_TiKu`表,并添加了 `LeiXing`(类型)、`TiGan`(题干)、`TiMu`(题目)、`DaAn`(答案)字段。点击保存后,数据库会同步创建表。 + ### 生成实体按钮 -`生成实体`按钮,会生成`App_TiKu`对应的`TiKu`类,放在`Application/Entity`目录下。我们选择实体类型为`基础实体`。 -这时候后端会生成`TiKu`类,如果我们把现有的表删除,在`tiKu.cs`中添加`[IncreTable]`标记,这时重启服务,数据库会重新创建表,并且带有了表的继承特性。`EntityBase` -具体的`[IncreTable]`标记,请看[配置文件 - IncreTable标记说明](./peizhiwenjian.md#incretable标记说明)。 +`生成实体`按钮,会生成 `App_TiKu`对应的 `TiKu`类,放在 `Application/Entity`目录下。我们选择实体类型为 `基础实体`。 +这时候后端会生成 `TiKu`类,如果我们把现有的表删除,在 `tiKu.cs`中添加 `[IncreTable]`标记,这时重启服务,数据库会重新创建表,并且带有了表的继承特性。`EntityBase` -> 所以综上:在Entity文件夹中直接创建类并且添加`[IncreTable]`标记,效率更快,尤其是有AI帮手,会比网页新增效率高。 +具体的 `[IncreTable]`标记,请看[配置文件 - IncreTable 标记说明](./peizhiwenjian.md#incretable标记说明)。 + +> 所以综上:在 Entity 文件夹中直接创建类并且添加 `[IncreTable]`标记,效率更快,尤其是有 AI 帮手,会比网页新增效率高。 ### 同步机制 + 下面,我们对同步机制做一些测试性验证。 -#### 实验1:在前端页面生成表之后,重新初始化表 -``` csharp + +#### 实验 1:在前端页面生成表之后,重新初始化表 + +```csharp 在前端页面生成表,只生成基础字段,不生成ID和`EntityBase`扩展。 在entity文件上增加`[IncreTable]`标记 配置文件配置为 TT;FF @@ -28,11 +39,16 @@ 数据库会重新创建表,并且带有了表的继承特性。 比如:CreateTime、DeleteTime、IsDeleted等 ``` ->结论:全新的表,系统会初始化表的继承特性。 -#### 实验2:生成按钮会不会覆盖实体文件 ->结论:会 -#### 实验3:有数据的表会不会被覆盖? -``` csharp + +> 结论:全新的表,系统会初始化表的继承特性。 + +#### 实验 2:生成按钮会不会覆盖实体文件 + +> 结论:会 + +#### 实验 3:有数据的表会不会被覆盖? + +```csharp 在前端页面生成表,只生成基础字段,不生成ID和`EntityBase`扩展。 手动在数据库中输入数据 在entity文件上增加`[IncreTable]`标记 @@ -41,12 +57,16 @@ 数据库会重新update表,表的数据不会丢失,增加了ID、`EntityBase`扩展。 比如:CreateTime、DeleteTime、IsDeleted等 ``` ->结论:会修复表,但是旧数据还在。 + +> 结论:会修复表,但是旧数据还在。 ## 手动生成 -我们已经知道了,库表管理就是给entity文件夹下面新增了一个文件,格式完全按照`SqlSugar`来的,所以手动写可能更快。 + +我们已经知道了,库表管理就是给 entity 文件夹下面新增了一个文件,格式完全按照 `SqlSugar`来的,所以手动写可能更快。 + ### 代码生成器的标准格式 -``` csharp + +```csharp /// /// TiKu业务表 /// @@ -55,75 +75,81 @@ public class TiKu : EntityBase { /// - /// + /// /// [Required] [SugarColumn(ColumnName = "TiGan", ColumnDescription = "题干", Length = 64)] public string TiGan { get; set; } - + /// - /// + /// /// [SugarColumn(ColumnName = "XuanXiang", ColumnDescription = "选项", Length = 64)] public string? XuanXiang { get; set; } - + /// - /// + /// /// [Required] [SugarColumn(ColumnName = "DaAn", ColumnDescription = "答案", Length = 64)] public string DaAn { get; set; } - + /// - /// + /// /// [Required] [SugarColumn(ColumnName = "LeiXing", ColumnDescription = "类型", Length = 64)] public string LeiXing { get; set; } - + } ``` ### 自己写一个简版 + 那我们自己写一个简单版的岂不是更快? -看一下sqlsugar的原版要求: [sqlsugar建模官网文档](https://www.donet5.com/Home/Doc?typeId=1182) -``` csharp +看一下 sqlsugar 的原版要求: [sqlsugar 建模官网文档](https://www.donet5.com/Home/Doc?typeId=1182) + +```csharp [SugarTable("APP_TiKu2")] [IncreTable] public class TiKu2 : EntityBase { /// - /// + /// /// + //Required .NET特性 含义是必填;sqlsugar解析为数据库的not null //这个`Required`是干嘛的?以后研究,暂且保留 [Required] public string TiGan { get; set; } - + /// - /// + /// /// public string? XuanXiang { get; set; } - + /// - /// + /// /// [Required] public string DaAn { get; set; } - + /// - /// + /// /// [Required] public string LeiXing { get; set; } - + } ``` ->结论1:也生成了。 +> 结论 1:也生成了。 ->结论2:啥也不写,默认255 varchar +> 结论 2:啥也不写,默认 255 varchar ->结论3:string?就不生效了。 +> 结论 3:string?就不生效了。 +> +> 因为 string 是引用类型,默认情况下就是可为空 ![alt text](./images/shengchengqi/02.png) -### 代码生成功能 \ No newline at end of file + +### 代码生成功能 -- Gitee From 1a736bc1dcc12e476a0fb9e331b43ed920e636ff Mon Sep 17 00:00:00 2001 From: YuChen Date: Wed, 19 Mar 2025 17:45:14 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[shengchengqi]=E7=94=9F=E6=88=90=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vuepress-starter/docs/shengchengqi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vuepress-starter/docs/shengchengqi.md b/vuepress-starter/docs/shengchengqi.md index 2ddffb1..aaabd49 100644 --- a/vuepress-starter/docs/shengchengqi.md +++ b/vuepress-starter/docs/shengchengqi.md @@ -4,7 +4,7 @@ 库表管理页面是直接映射数据库的。 -`CodeFirst`:代码优先;开发者先编写代码(领域模型的类),由代码实体生成数据库接口。对应的有 `DbFirst`与之相反。 +`CodeFirst`:代码优先;开发者先编写代码(领域模型的类),由代码实体生成数据库表。对应的有 `DbFirst`,与之相反。 也就是说 -- Gitee