访问和操作数据库是ASP.NET程序开发的必备技能之一,在程序开发过程中主要是通过SQL语句来操作数据库。在以往我们都是通过在程序代码里拼接字符串来构造SQL语句,这种写法有太多的弊端了。
难以拼接,尤其是涉及到复杂的查询时,需要构造的SQL语句非常多,一不小心就会打错一个字符,又不容易发现。难以阅读,在程序代码里SQL语句是无法格式化的,保留字也无法高亮显示,难以理解SQL语句的意思,有时甚至自己写好了都不想看第二眼。难以维护,由于前面2点原因,后面想修改或扩充SQL语句,就变得异常困难。尤其是当需要从一种数据库(如SQLSERVER)转换到另一种数据库(如MySQL)时更是灾难性的,因为每种数据库的SQL命令语法都不完全一样,这时所有不一样语法的地方都要统统修改过来,就变得几乎不可能了。于是,不同的编程语言,不同的人就提出了不同的解决方案,ASP.NETCore是通过EntityFrameworkCore实体框架(以下简称EFCore)来解决以上提到的几个问题,通过使用EFCore,我们写SQL语句跟平常写代码一样,通过面向对象的方式来查询或操作数据库。不同的数据库查询语法,可以通过LINQ语言集成查询(LanguageIntegratedQuery)来实现统一。
那么EFCode是如何通过编程的方式来实现操作数据的呢?我们知道,数据库是由一张张表构成的,表存储了数据。在程序里我们可以用类(class)来映射数据库的表,用集合(List等)来存储数据。这个类就是实体类,数据库中的每一张表程序里都对应一个实体类,这样通过操作实体类,就能间接操作数据库的表了。
比如常见的购物车,假设数据库有2张表,一张是产品表,一张是购物车表,它们的关系如下图:
产品表有编号、名称、库存、详情字段。购物车表有购物车编号、购买数量、产品单价、总额、产品编号,它们是1对多的关系。产品表的一个产品会对应购物车表的多条记录,而购物车表的一条记录只会对应一个产品,通过产品编号来关联。
在程序里有2个实体类Product、ShoppingCar,分别对应产品表、购物车表。
实体类ProductpublicclassProduct{publicintID{get;set;}publicstringName{get;set;}publicintStock{get;set;}publicstringDetail{get;set;}publicListShoppingCarShoppingCars{get;set;}}------------------------------------实体类ShoppingCarpublicclassShoppingCar{publicintID{get;set;}publicintQuantity{get;set;}publicdecimalPrice{get;set;}publicdecimalTotal{get;set;}publicintProductID{get;set;}publicProductProduct{get;set;}}
可以看到类名对应表名,类属性对应表字段。
查询数据
以上就是通过实体类查询数据库产品表的库存大于0,按价格排序的产品数据以及查询购物车表的数据的方法,查询购物车的数据时关联到产品表以查出产品名称,EFCode会把以上的程序代码翻译成数据库的SQL语句:
SELECT*FROM[Product]WHERE[Stock]0ORDERBY[Price];------------------------------------SELECT[s].[ID],[s].[ProductID],[s].[Quantity],[s].[Price],[p].[Name]FROM[ShoppingCar]AS[s]INNERJOIN[Product]AS[p]ON[s].[ProductID]=[p].[ID];
保存数据
新增产品时,只需要创建一个产品类的实例,给类实例属性赋值,再调用数据库上下文(db)的Add()和SaveChanges()方法即可。同样,EFCode会把以上的程序代码翻译成数据库的SQL语句:
INSERTINTO[Product]([Detail],[ExpireDate],[Name],[Price],[Stock])VALUES(
p0,p1,p2,p3,p4);当然,要实现这些功能还有很多准备工作要做,在VisualStudioCommunity版和.NET5.0框架下:
创建和配置数据库上下文对象。创建模型,设置和管理模型之间的关系。EFCode数据迁移。保存数据的实现。查询数据的实现。删除数据的实现。性能测试。后续篇章一一介绍以上功能。