优秀的编程知识分享平台

网站首页 > 技术文章 正文

C# .NET 6实战校园图书管理系统:第三章 项目结构以及数据库的设计

nanyue 2024-08-18 19:46:12 技术文章 11 ℃

1. 前言

哈喽!各位同学大家好!上一章我们做了简要的需求分析,接下来本章我们继续实现项目的创建和数据库的设计。因为个人原因在使用数据库的时候不喜欢使用外键,因此本次设计依然是无外键的。至于外键的优劣在这里不做过多的讨论,有兴趣的同学可以自行搜索了解。好了闲话不多说,请看正文。

2. 本章实现

3. 项目结构创建

系统采用Microsoft Visual Studio Enterprise 2022 (64 位) 版本 17.0.1创建。

说明:

  • FlyingHat.Common 通用公共类
  • FlyingHat.Extensions 公共插件及扩展
  • FlyingHat.Model 基础设施层,主要是实体、枚举、逻辑类等
  • FlyingHat.Repository 仓储层,主要用来处理数据交互
  • FlyingHat.Service 业务层,主要用来处理业务逻辑
  • FlyingHat.Web 展现层,主要是页面显示FlyingHat.Web 创建时选择 ASP.NET Core Web 应用(模型-视图-控制器) 选项。

其他项目均选择类库 选项。

特别说明: 本项目并没有使用 DDD领域驱动设计。其一是对DDD理解不够深,其二在实际工作中同事们的技术水平、开发方式都各不相同,在普通的公司更多的是对产品的维护和升级,涉及到开发新产品也大多数也不是从基础框架开始。毕竟在普通的公司都不是技术驱动的。其三我觉得是最重要的,适合自己的框架和风格才是最有利于自己的。所以我设计的结构仅供各位同学参考。

4.数据库设计

目前涉及到的表有学生、图书、图书室、书架、图书分类、借还书。至于菜单和权限这些我认为并不是最开始需要的,而是在中途或者结束的时候统一设计。我个人的习惯是放到最后统一设计菜单和权限,这样不会影响到前期的开发。

实体类设计如下:

因为不使用外键,所以表关系和系统流程要做到心中有数,同时要记录在案。后续如有变动再修改,因为系统是迭代开发的,因此不可能不变,因此不必过分追求一次成型。

5. 创建实体及数据库

5.1 实体创建

实体特别说明

  • BaseEntity:公共基础类,是被其他实体类继承的对象。内含公共 ID,创建对象、修改对象
  • BaseContext:实体上下文。用于管理实体,即增删改查对象在BaseContext中重写OnModelCreating方法,主要是生成种子数据,这里默认生成一个超级管理员用户。注意OnModelCreating方法在每次数据迁移时都会执行,因此如果有更多的种子数据需要执行,那么这里可以写成一个调用方法,种子数据生成可以封装到其他地方。同时要注意每次迁移,如果此处种子不需要再次执行那么需要注释调用
  protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var salt = Guid.NewGuid().ToString("N");
            var pwd = EncryptHelper.Get32Md5(#34;123456{salt}");
            var u = new User()
            {
                Id = 1,
                UserName = "flyinghat",
                RealName = "超级管理员",
                Password = pwd,
                Salt = salt,
                UserStatus = UserStatus.Enable,
                Gender = Gender.Male,
                Identity = Identity.SuperAdmin,
                LastLoginTime = DateTime.Now,
            };
            modelBuilder.Entity<User>().HasData(u);
            base.OnModelCreating(modelBuilder);
        }

具体实体的内容,请各位同学下载源码即可,这里不做详细的描述。

没有必要使用命令安装,可视化管理界面更方便

包说明

  • Microsoft.EntityFrameworkCore :版本:6.0.0 EFCore 实体框架,对象数据库映射器。安装到FlyingHat.Model
  • Microsoft.EntityFrameworkCore.Tools :版本:6.0.0 NuGet Package Manager控制台的实体框架核心工具,主要用于数据迁移。在接下来的数据创建时会做详细说明。安装到FlyingHat.Web
  • Pomelo.EntityFrameworkCore.MySql :版本:6.0.0 MySQL数据库驱动程序。安装到FlyingHat.Model

特别说明:数据迁移主要依赖两个包:Microsoft.EntityFrameworkCore.Tools,

Microsoft.EntityFrameworkCore.Design。因为Microsoft.EntityFrameworkCore.Tools依赖

Microsoft.EntityFrameworkCore.Design,因此在安装

Microsoft.EntityFrameworkCore.Tools的时候已经同时安装了Microsoft.EntityFrameworkCore.Design,所以不必再重复安装。

5.2 数据迁移前的准备

做好项目依赖关系,由于VS 2022和.Net6 在项目依赖中做好了关联依赖,因此不必每个依赖项都引用,只要引用的项目也引用其他项目即可。


FlyingHat.Web项目中打开appsettings.json配置数据库连接字符串

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Connection": "Server=localhost;database=CampusLibrary;uid=root;pwd=123456;port=3306;charset=utf8mb4; sslmode=none;TreatTinyAsBoolean=true;allowPublicKeyRetrieval=true;",
    "RedisConnectString": "localhost:6379"
  }
}

FlyingHat.Extensions项目中创建文件夹ServiceExtensions,并创建类DataBaseService.cs

using System.Diagnostics;
using FlyingHat.Model.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

namespace FlyingHat.Extensions.ServiceExtensions
{
    public static class DataBaseService
    {
        public static void AddBaseContext(this IServiceCollection services, string connectionString)
        {
            services.AddDbContextPool<BaseContext>(optionsBuilder =>
            {
                // 设置mysql 连接,设置不追踪状态。PS:取消全局状态追踪,增加执行速度
           optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), i =>
                {
                    // 设置SQL执行超时时间
                    i.CommandTimeout(60);
                });
                // 打印SQL到控制台,这个主要是查看ORM生成的SQL
                optionsBuilder.LogTo(message => Debug.WriteLine(message));
            });
        }
    }
}

打开FlyingHat.Web项目中Program.cs类,并将数据库服务注册到Service中

using FlyingHat.Extensions.ServiceExtensions;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

// 添加数据库配置
var conn = builder.Configuration.GetConnectionString("Connection");
builder.Services.AddBaseContext(conn);

var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

5.3 开始迁移

FlyingHat.Web设置为启动项,并采用CodeFirst方式生成数据库

实体创建完成后,打开NuGet Package Manager控制台。工具=> NuGet包管理器=>程序包管理控制台

默认项目选中FlyingHat.Model项目,即实体和BaseContext上下文存在的项目中,执行以下命令

Add-Migration init   // init 是生成迁移文件的文件名

等待片刻就可生成

Migrations文件夹就是生成的迁移文件夹,其中BaseContextModelSnapshot.cs是生成的上下文快照。文件夹内的文件尽量不要动它,它是自动生成的迁移文件用来维护生成脚本。后续如果修改了实体类相关属性或者新增了实体类,在BaseContext.cs中声明后再次执行迁移命令即可。

Update-DataBase   // 开始利用Migrations文件夹内的文件同步到数据库

在迁移数据时如果出现错误,可以根据错误提示进行修复或者各位同学可以自行搜索解决方案或者在评论区或私信我帮助解决。

命令执行成功后,打开数据库查看生成。

__efmigrationshistory表是迁移历史表,该表由Migration自动生成并维护。当执行Update-Database命令时,EFCore会对比表__efmigrationshistory和项目中的Migrations文件夹,决定需要执行的Migration

谨记:此数据迁移仅用在开发阶段,在生产环境务必禁止使用。如有必要每次更新要做好相关备份,以防意外情况发生需要回滚。

Migration有很多命令,最常用的就是Add-MigrationUpdate-Database,至于其他的命令很少用得到的,了解即可。只要记住凡实体变动则必Add-MigrationUpdate-Database

Add-Migration
Bundle-Migration
Drop-Database
Get-DbContext
Get-Migration
Optimize-DbContext
Remove-Migration
Scaffold-DbContext
Script-Migration
Update-Database

6. 结语

本章做了项目结构及数据库的设计创建,从本章开始就正式介入程序开发的阶段,各位同学在阅读实践过程中有看不懂或有其他想法的可以在评论区留言或者私信。教程有帮助的话请各位同学帮忙评论点赞关注三连,感谢大家!下一章我们开始搭建项目基础仓储方法并介绍一下小编的开发模式及风格。

----------------------------------------------------

私信: 校园图书管理系统 可以获取Gitee的链接

Tags:

最近发表
标签列表