《ProASP.NETMVC5》、《锋利的jQuery》
此系列皆使用VS2017+C#作为开发环境。如果有什么问题或者意见欢迎在留言区进行留言。
本章内容:对图书馆系统组成的简要分析。以及对域模型以及相应数据库的建立。
知识点:CodeFirst、EF基本使用方法、ASP.NETCore使用EFCore的配置方法。
一、对图书馆系统域模型的分析
一个图书馆系统需要有管理员、学生、书架以及书籍
域模型,即用来存储数据的模型。
在此域模型可以用以下结构创建:
二、项目结构
然后就可以开始建立该项目了:
Docker支持和身份验证在以后可以自行添加,在此就不使用相应的支架特性。
所谓支架特性就是VS2017能够自动为我们完成一系列的工作的特性,当然这部分工作也可以自行完成。
创建一个单元测试项目并引用LibraryDemo为以后的单元测试做准备。
然后正式开始图书馆项目的编写:
为了辨识,我创建了这样的文件夹结构,这里的Migrations文件夹由后面提到的EF自动创建。
三、建立域模型
学位枚举:
1publicenumDegrees2{3CollegeStudent,4Postgraduate,5DoctorateDegree6}
图书借阅状态枚举:
1publicenumBookState2{3///
学生信息:
在约定中,若不指定主键,则EF会使用(类名)+ID的方式指定或创建主键,在此使用[Key]指定主键,使用[Required]指定字段为必须,这种可以为属性添加在数据库中的约束或者在视图中的约束的修饰称为DataAnnotations。
借阅书籍信息:
书籍详细信息:
书架信息:
推荐书籍信息的结构与书籍详细信息一致:
四、创建DbContext
根据约定,创建DbContext类为EF提供建立的数据库的结构:
1publicclassStudentIdentityDbContext:IdentityDbContext
每个DbContext类代表一个数据库,每个DbSet
五、根据约定配置数据库,进行依赖注入
在appsettings.json中添加数据库连接字符串。
在Startup.cs中的ConfigureServices方法中对数据库进行配置:
六、数据库的迁移、创建及更新
然后在pm控制台中添加迁移:
添加迁移的语法为add-migration<迁移类名>-c<具体DbContext名>
分别执行以下代码:
1cdLibraryDemo2add-migrationAdmin-cLibraryDemo.Data.AdminDbContext3add-migrationLendingInfo-cLibraryDemo.Data.LendingInfoDbContext4add-migrationStudentIdentity-cLibraryDemo.Data.StudentIdentityDbContext
运行add-migration命令会创建Migrations文件夹以及相应的迁移快照,此处的AddSomeDetails和AddRequired为后来我自己添加的内容:
在创建迁移时,EF会自动为我们创建或更新对应DbContext的快照,即其中后缀为Snapshot的类。其中会包含当前对应的DbCOntext的结构,并会以代码保留相应的约束,如LendingInfoDbContextModelSnapshot类:
生成的迁移类LendingInfo和Account类则有两个方法——用于更新数据库的Up方法和用以回溯数据库的Down方法,可以在这两个方法或者在快照的BuildModel方法中使用FluentAPI对数据库做进一步的改动,并且通过对FluentAPI的使用可以使我们的类少用DataAnnotations以保证类的整洁。
需要注意的是,生成的迁移类中的Up和Down方法是根据生成迁移之前的数据库快照生成的,如我在之后为LendingInfoDbContext添加DbSet
随后在pm控制台执行以下创建或更新数据库:
1update-database-cLibraryDemo.Data.AdminDbContext2update-database-cLibraryDemo.Data.LendingInfoDbContext3update-database-cLibraryDemo.Data.StudentIdentityDbContext
最后在SQLserver对象管理器中可以看见创建的数据库以及对应的表:
至此域模型创建工作完成。
补充:
使用命令行对数据库进行迁移及更新有两种方式:
1dotnetefmigrationsmigrationName-cTargetContext2dotnetefdatabaseupdate-cTargetContext
1add-migrationmigrationName-cTargetContext2update-Database-cTargetContextwindows命令行命令不区分大小写,其中migrationName为迁移类名,最好提供有意义的命名;而TargetContext为目标DbContext类名,需要使用带有命名空间的完全命名。