当前位置:   article > 正文

教你如何给.Net项目创建本地数据库、建立表,完成增删改查(基于visual stdio)_vs 增删改数据库 model

vs 增删改数据库 model

一、环境配置与模型创建

第1步:新建项目

创建新的项目命名为Exams

 

选择Exams点击运行,测试是否能够运行成功:

如果出现下面界面,代表运行成功:

文件夹的结构如下:

wwwroot 文件夹:包含静态文件,如 HTML 文件、JavaScript 文件和 CSS 文件。

appSettings.json:包含配置数据,如连接字符串

Program.cs:包含程序的入口点。

第2步:配置环境

添加工具,安装Entity Framework core等...

首先找到要添加依赖的模块,然后右键依赖项,点击管理NuGet程序包:

可以看到<已安装>的工具,在<浏览>输入下面5个工具名进行安装:

1.Microsoft.EntityFrameworkCore

2.Microsoft.EntityFrameworkCore.Sqlite

3.Microsoft.EntityFrameworkCore.SqlServer

4.Microsoft.EntityFrameworkCore.Tools

5.Microsoft.VisualStudio.Web.CodeGeneration.Design

安装结果如下:

其中1、2、4、5必须安装。

第3步:添加数据模型

右键模块,新建文件夹models文件夹和Data文件夹:

 

右键新建的项目-添加-类,新建类ExamSite:

考场表设计如下:

  1. 考场表:考场ID,考场名,所属校区,所属楼名,房间号
  2. ExamSiteId ->Int
  3. ExamSiteName -> String
  4. School -> String
  5. Building -> Int
  6. Room -> Int

复制如下代码粘贴入ExamSite.cs,主要是用来定义表的结构:

  1. using System.ComponentModel.DataAnnotations;
  2. namespace Exams.Models;
  3. public class ExamSite
  4. {
  5. public int ExamSiteId { get; set; }
  6. public string? ExamSiteName { get; set; }
  7. public string? School { get; set; }
  8. public string? Building { get; set; }
  9. public int? Room { get; set; }
  10. }

二、搭建基架

首先右键Pages文件夹,创建一个Exam文件夹

然后右键Exam文件夹选择添加,选择<新搭建基架的项目>

紧接着选择<使用实体框架生成Razor页面(CURD)>,选择添加。

最后:

1. 在模型类选择ExamSite (Exams.Models)。这个是Models文件夹下的文件。

2, 在数据上下文类中先选中ExamSiteContext(Exams.Data),然后选择+,生成类名Exams.Data.ExamsContext。

选择添加。

 经过大概1分钟的生成,生成了如下文件:

三、修改Program.cs文件

在前一步<数据上下文类>中选择的类名,会在Data文件夹下生成一个新的类:

名字是自动生成的是,一般是<模块名Context.cs>。

我们接下来要在本模块的Program.cs中添加如下代码:

using Exams.Data;

using Exams.Data是为了让Program.cs能够引入ExamsContext文件。

  1. builder.Services.AddDbContext<ExamsContext>(options =>
  2. options.UseSqlite("Data Source=Exam.db"));

其中ExamsContext就是刚刚自动生成的文件,然后Exam.db是我们想要生成的目标数据库的名字。

四、数据库迁移

在vs中的工具选择NuGet包管理器-程序包管理器控制台

2.输入Add-Migration InitialCreate创建数据表

3.Update-Database

可以看到在模块的末尾出现了一个Exam.db的文件:

将Exam.db文件直接拖到Navicat中可以直接看到该表:

可以发现像ExamSiteId这些字段就是我们在<一>中创建的数据模型中定义的字段。

五、增删改查测试

选择Exam,点击运行项目之后,可以在浏览器地址中加入后缀</文件夹名/文件名>进行访问:

比如在Exam文件夹下有4个类:分别用来增删改查。

Create代表的新增,Edit代表的是修改,如果想要调用新增的界面只需要添加/Exam/Create后缀即可:https://localhost:7110/Exam/Create。

假如我们输入以下的数据进行简单测试:

首先在网页中会出现新增的数据:

然后在数据库中也会实时更新数据:

由此可以推测,数据会被直接插入到Exam.db文件中,并且可以实时进行访问。

下面是增、删、改、查的一些说明:

删、改、查如下:

由此便实现了通过.Net来实现数据库和表的建立以及基本的增删改查。

六、同一数据库中新建多张表

1. 考试表数据结构定义:

考试表:考试ID,考试名,报名开始时间,报名结束时间,排考开始时间,排考结束时间,考试开始时间,考试结束时间

  1. 考试表:考试ID,考试名,报名开始时间,报名结束时间,排考开始时间,排考结束时间,考试开始时间,考试结束时间
  2. Exmination表
  3. 字段定义如下:
  4. ExamId ->Int
  5. ExamName -> String
  6. SignUpBeginTime -> DateTime
  7. SignUpEndTime -> DateTime
  8. ArrangeExamBeginTime -> DateTime
  9. ArrangeExamEndTime -> DateTime
  10. ExamBeginTime -> DateTime
  11. ExamEndTime -> DateTime
  1. namespace Exams.Models
  2. {
  3. public class Examination
  4. {
  5. public int ExamId { get; set; }
  6. public string? ExamName { get; set; }
  7. public DateTime? SignUpBeginTime { get; set; }
  8. public DateTime? SignUpEndTime { get; set; }
  9. public DateTime? ArrangeExamBeginTime { get; set; }
  10. public DateTime? ArrangeExamEndTime { get; set; }
  11. public DateTime? ExamBeginTime { get; set; }
  12. public DateTime? ExamEndTime { get; set; }
  13. }
  14. }

2. 考试-考场关联表数据结构定义:

考试-考场关联表:记录ID,考试ID,考场ID

  1. 考试-考场关联表:记录ID,考试ID,考场ID
  2. ExamAndExamSite表
  3. 字段定义如下:
  4. recordId -> Int
  5. ExamId -> Int
  6. ExamSiteId -> Int
  1. namespace Exams.Models
  2. {
  3. public class ExamAndExamSite
  4. {
  5. public int recordId { get; set; }
  6. public int? ExamId { get; set; }
  7. public int? ExamSiteId { get; set; }
  8. }
  9. }

在定义完上面3张表的数据模型之后。

第1步:在Pages下再新建两个文件夹Exam1和Exam2,对应关系如下:

Exam -> ExamSite.cs(考场表的增删改查操作)

Exam1 -> Examination.cs(考试表的增删改查操作)

Exam2 -> ExamAndExamSite.cs(考试和考场表的增删改查操作)

第2步:修改Data文件夹下的ExamsContext.cs文件

ExamsContext.cs文件会在对ExamSite生成实体框架后形成:

新的ExamsContext.cs文件的代码如下:

  1. using Microsoft.EntityFrameworkCore;
  2. using Exams.Models;
  3. namespace Exams.Data{
  4. public class ExamsContext : DbContext{
  5. public ExamsContext (DbContextOptions<ExamsContext> options)
  6. : base(options){
  7. }
  8. public DbSet<Exams.Models.ExamSite> ExamSite { get; set; } = default!;
  9. public DbSet<Exams.Models.Examination> Examination { get; set; } = default!;
  10. //定义了Examination它是DbSet<Examination>类型的,框架会将Examination类与一个表关联起来,表名默认为类名
  11. public DbSet<Exams.Models.ExamAndExamSite> ExamAndExamSite { get; set; } = default!;
  12. protected override void OnModelCreating(ModelBuilder modelBuilder){
  13. modelBuilder.Entity<Examination>().HasKey(e => e.ExamId); // 配置 Examination 的主键
  14. modelBuilder.Entity<ExamAndExamSite>().HasKey(e => e.recordId); // 配置 ExamAndExamSite 的主键
  15. }
  16. }
  17. }

主要新增了另外两张表的定义,以及设定了两张表的主键。

第3步:分别选中Pages文件夹下的Exam、Exam1、Exam2文件夹分别搭建基架,模型类分别选择ExamSite.cs、Examination.cs、ExamAndExamSite.cs这几个文件,数据上下文类一律选择Exams.Data.ExamsContext。

项目的最终结构如下:

   

第4步:按照先前的方式进行数据库迁移,成功后生成Exam.db文件,然后可以放到Navicat中查看,会发现此时Exam.db数据库中已经有了3张表:

ExamSite:考场表如下:

Examination:考试表如下:

ExamAndExamSite:考试-考场表如下:

七、支持API控制器(通过url访问类/方法)

首先要在待运行的模块下面新建一个Controllers文件夹,然后可以在Controllers文件夹下创建一个类,类名最后以Controller结尾:

注意命名空间要写:模块名.文件夹名。public class 类名 :Controller。如下图是一个最基本的程序:

  1. using Microsoft.AspNetCore.Mvc.RazorPages;
  2. using Microsoft.AspNetCore.Mvc.Rendering;
  3. using Exams.Data;
  4. using Exams.Models;
  5. namespace Exams.Controllers
  6. {
  7. [Route("test")] // 基路由,将处理 /test 的请求
  8. public class WayController : Controller
  9. {
  10. [HttpGet("a")] // 完整的路由将变成 /test/a
  11. public IActionResult Print()
  12. {
  13. var data = new { message = "aaa" }; // 创建一个匿名对象作为 JSON 数据
  14. return Json(data); // 返回 JSON 结果
  15. }
  16. }
  17. }

然后千万要注意修改Program.cs,要加入下面两段代码 :

  1. builder.Services.AddControllers();
  2. app.MapControllers();

builder.Services.AddControllers(); // 添加这行以支持API控制器

app.MapControllers(); // 在这里注册API控制器的路由 

然后在url后面加上/test/a即可输出aaa了!

八、获取处于报名期间的所有考试实现

List<Exam> GetActiveExam(DateTime now)接口实现

接口功能:获取处于报名期间的所有考试

业务逻辑:首先获取当前系统时间now,考试报名开始时间beginTime,考试报名结束时间endTime,beginTime<=now<=endTime。

返回的结果如下(时至21号,上述时间有所修改,微积分和离散数学设为未过期):

程序思路:

首先,定义一个函数getNowTime用于获取当前的系统时间:

使用DateTimeOffset函数进行时间的获取。

  1. public DateTimeOffset getNowTime(){
  2. //DateTime localTime = DateTime.Now;
  3. DateTimeOffset dateTimeOffset = DateTimeOffset.Now;
  4. return dateTimeOffset;
  5. }

然后,定义了一个Result结构体,用于存放返回的提示信息和考试表中的数据。 

  1. public struct Result{
  2. public string response { get; set; }
  3. public Examination examination { get; set; }
  4. }

 最后是具体的业务逻辑:调用_context.Examination.ToList()获取考试表中所有数据的集合,调用getNowTime获取当前的系统时间。

然后通过foreach循环提取考试表中的每一条数据,将每条数据的报名开始时间和结束时间逐一提取出来。

紧接着判断当前系统时间和开始时间、结束时间之间的大小关系,分为3种情况:1.报名未开始,2.报名已结束,3.报名正在进行中。如果是前两种情况,则考试的详细信息返回为空,如果可以报名,则返回该门考试的详细信息。

下面是完整的代码: 

  1. using Microsoft.AspNetCore.Mvc;
  2. using Exams.Models;
  3. namespace Exams.Controllers{
  4. public class WayController : Controller{
  5. private readonly Exams.Data.ExamsContext _context;
  6. public struct Result{
  7. public string response { get; set; }
  8. public Examination examination { get; set; }
  9. }
  10. public WayController(Exams.Data.ExamsContext context){
  11. _context = context;
  12. }
  13. public DateTimeOffset getNowTime(){
  14. //DateTime localTime = DateTime.Now;
  15. DateTimeOffset dateTimeOffset = DateTimeOffset.Now;
  16. return dateTimeOffset;
  17. }
  18. [HttpGet("GetActiveExam")]
  19. public ActionResult<List<Result>> Compare()
  20. {
  21. List<Result> finalResult = new List<Result>();
  22. List<Examination> LIST = _context.Examination.ToList();
  23. DateTimeOffset nowTime = getNowTime();
  24. Result result = new Result();
  25. foreach (Examination list in LIST)
  26. {
  27. DateTimeOffset newSignUpBeginTime = new DateTimeOffset((DateTime)list.SignUpBeginTime);
  28. DateTimeOffset newSignUpEndTime = new DateTimeOffset((DateTime)list.SignUpEndTime);
  29. if (nowTime < newSignUpBeginTime)
  30. {
  31. result.response = list.ExamId + list.ExamName + ":报名未开始";
  32. result.examination = null;
  33. }
  34. else if (nowTime > newSignUpEndTime)
  35. {
  36. result.response = list.ExamId + list.ExamName + ":报名已结束";
  37. result.examination = null;
  38. }
  39. else
  40. {
  41. result.response = list.ExamId + list.ExamName + ":报名成功";
  42. result.examination = list;
  43. }
  44. finalResult.Add(result);
  45. }
  46. return finalResult;
  47. }
  48. }
  49. }

结果如下:

代码是在Exams模块的Controller层的WayController.cs下。

测试数据:

考试表:

考场表:

考试-考场表:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/856112
推荐阅读
相关标签
  

闽ICP备14008679号