解析ASP.NET MVC开发之查询数据实例

简介:

目录:

1)从明源动力到创新工场这一路走来

2)解析ASP.NET WebForm和Mvc开发的区别

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


对于.NET平台上开发WebForm项目,程序员操作数据的方法主要是通过使用ADO.NET。而我们MVC操作数据库呢? 与ADO.NET相比又有怎样的优势呢?

一,大家都在谈的EF到底是什么?

EF ,全称Entity FramWork。就是微软以ADO.NET为基础发展的所谓ORM(对象关系映射框架,或者说是数据持久化框架)。

简单的来说就是根据实体对象操作数据表中数据的一种面向对象的操作框架,具体的底层也是调用ADO.NET。具体概念可以参考维基百科(点击我转到)。

下面我们就来演示怎么使用EF来操作数据库:

点击这里可以下载我创建数据库的脚本文件,当然你也可以是使用自己的数据库。

在数据库关系图中,表之间的关系是这样的:

01221235-89c28a1925ad48f7a800c38ccdb77c1

1)怎么创建实体对象模型文件

①创建基于ADO.NET的实体数据模型

我这里在我的Models文件夹(可以在任意地方哦)上“右键”→“新建项”,然后点击进入,在左侧的模板中,选择"数据",在右侧就会看到“ADO.NET实体数据模型”的选项,如下图:

01221956-b7692558afcf4e2db79930272481d76


②点击创建,进入”实体数据模型向导“,这里我们可以选择,要怎样创建实体数据模型

01222212-5a12548faad34243a48bbf4bf711e3b

注意:这里你可以分别选择一种模型,在下边的框中看到这两种模型的区别,这里不多做解释;

因为我们是从已经有的数据库创建实体模型,所以选择第一种”从数据库生成“


③点击下一步,进入连接数据库的向导,通过新建连接,可以连接到自己的SQL Server服务器,然后选择我们所要连接的数据库,同时会生成实体连接字符串,如下图:

01222748-3c560288e1ff44369d8ed723295143c


④点击下一步,选择”实体框架版本“

01223109-d57d11630b18409299282167d49a53e


⑤下一步,选择需要在模型中包含的数据库对象,选择”确定所生成对象的单复数形式“,其它保持默认,点击完成。如下图:

01223411-907cdee2cad04a499808d3d1737b341


这时会在我们的Models文件夹下边生成一个edmx文件,同时EF框架的设计器帮我们生成了根据数据表关系生成的实体类的关系图,如下图:

01224021-d59943c70b0740d0a1b6ec5490a015e

注意:这里是不是发现这个表跟我们在数据库关系图中看到的图有点相似啊?是的,很相似,但是所表达的意义是不一样的。数据库视图所展示的是数据表之间的关系,而这里展示的EF帮我们根据数据表关系生成的实体类的关系;

2)生成的edmx文件到底是什么?

edmx文件的代码树如下:

01224908-02859da6fe1d4b68bd1944b8b1356ed

①怎么会是XML文件?

我们通过”右键“→”打开方式“→在”XML编辑器“中打开,可以发现这个edmx文件是一个标准的XML文件,其中主要有三大块,描述的就是我们的实体对象和数据库映射的关系。如下图:

01225319-43ba368d88b54714987f3c58862924f

②.tt文件下怎么生成了.cs文件?


  数据库上下文类。

  在代码树中我们很容易的发现,在.tt文件下边生成了.cs类文件。”OumindBlog.Context.cs“文件的代码和作用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//继承自DbContext类,  
//数据上下文类,用于操作数据库。负责维护实体状态,以及根据实体对象包装类的状态属性,生成不同的SQL语句执行
     public  partial  class  OumindBlogEntities : DbContext
     {
         public  OumindBlogEntities()
             base ( "name=OumindBlogEntities" )
         {
         }
                                                                                                                                    
         protected  override  void  OnModelCreating(DbModelBuilder modelBuilder)
         {
             throw  new  UnintentionalCodeFirstException();
         }
                                                                                                                                    
         public  DbSet<BlogArticle> BlogArticles {  get set ; }
         public  DbSet<BlogArticleCate> BlogArticleCates {  get set ; }
         public  DbSet<BlogUser> BlogUsers {  get set ; }
         public  DbSet<Enumeration> Enumerations {  get set ; }
     }

  实体类。

  而另一个.tt文件生成的类是做什么用呢?我们打开一个看代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//EF按照实体模型生成的实体类
     public  partial  class  BlogArticleCate
     {
         public  BlogArticleCate()
         {
             this .BlogArticles =  new  HashSet<BlogArticle>();
         }
                                                                                                                               
         public  int  Id {  get set ; }
         public  int  Author {  get set ; }
         public  string  Name {  get set ; }
         public  string  Remark {  get set ; }
         public  int  Statu {  get set ; }
         public  bool  IsDel {  get set ; }
         public  System.DateTime Addtime {  get set ; }
                                                                                                                               
         //生成的外键属性
         public  virtual  ICollection<BlogArticle> BlogArticles {  get set ; }
         public  virtual  BlogUser BlogUser {  get set ; }
     }


很容易的发现这些字段和我们数据库中的字段是对应的,这就是EF按照实体模型生成的实体类,而且在还成了外键属性。

---------------------------------------------------预备工作到此结束--------------------------------------------------

二,使用EF操作数据库

在上面”OumindBlog.Context.cs“中生成继承DbContext的OumindBlogEntities 的类,来维护实体状态,并且操作数据库,所以我们首先要创建该类的对象,并且操作数据的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//创建数据库上下文类的对象
         OumindBlogEntities db =  new  OumindBlogEntities();
         #region 查询文章列表+ActionResult Article()
         /// <summary>
         /// 查询文章列表
         /// </summary>
         /// <returns></returns>
         public  ActionResult Article()
         {
             //通过db对象获取文章列表
             db.BlogArticles.Where(p => p.AIsDel ==  false ); //使用Lamabda表达式来获取为被删除的文章
                                                                                                                                   
             //使用Lamabda表达式来获取数据
             //返回一个List<T>的对象来存储文章列表
             List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel ==  false ).ToList();
                                                                                                                                   
                                                                                                                                   
             //也可以使用Linq来获取数据
             List<Models.BlogArticle> list1 = ( from  in  db.BlogArticles  where  p.AIsDel ==  false  select  p).ToList();
             //使用ViewData来传递list对象
             ViewData[ "DataList" ] = list;
             return  View();
         }
         #endregion

接着我们为Article创建视图,并且接收数据,
因为我们需要使用BlogArticle对象来显示数据,所以应该首先导入命名空间


1
2
<!------------首先导入命名空间------------->>
@ using  MvcApplication1.Models;

然后显示数据的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!------------获取数据并显示html-------------> >
     < div >
         < table  id = "tbList" >
             < tr >
                 < th >id</ th >
                 < th >标题</ th >
                 < th >分类</ th >
                 < th >状态</ th >
                 < th >时间</ th >
                 < th >操作</ th >
             </ tr >
             <!--遍历 Action方法 设置给 ViewData 的集合数据,生成HTML代码-->
             @foreach (BlogArticle a in ViewData["DataList"] as List< BlogArticle >)
             {
                 < tr >
                     < td >@a.AId</ td >
                     < td >@a.ATitle</ td >
                     < td >@a.BlogArticleCate.Name</ td >
                     < td >@a.Enumeration.e_cname</ td >
                     < td >@a.AAddtime</ td >
                                                                                                                             
                 </ tr >
             }
         </ table >
     </ div >

运行的结果如下:

02004815-bcad339e2e9b4a3788e8c0ea3739b04


三,总结

1)EF框架根据我们的数据库中数据模型生成实体数据模型;

2)实体数据模型为一个edmx文件,且该文件为一个标准的XML文件,主要描述实体对象和数据库映射关系;

3).tt文件为我们生成了数据库上下文类(用于操作数据库)和实体类(表示实体对象和外键属性关系);

4)实体对象可以使用Lamabda表达式或者Linq来查询需要的数据,并且使用一个List对象来存储数据;

5)易于理解代码,在实际的操作中不需要像ADO.net一样创造大量的数据库访问层;





     本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1347527,如需转载请自行联系原作者


相关文章
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
1070 3
|
开发框架 .NET 中间件
.net8 使用 license 证书授权案例解析
本文介绍了如何使用 `.NET CLI` 创建并改造一个 `ASP.NET Core Web API` 项目,以实现基于许可证的授权机制。具体步骤包括创建项目、添加必要的 NuGet 包(如 `Standard.Licensing` 和 `Swashbuckle.AspNetCore`),以及修改 `Program.cs` 文件以集成自定义的许可证验证中间件。项目结构中新增了 `LicenseController` 接口用于处理授权相关操作,并通过测试流程验证了默认天气接口在未授权和授权状态下的响应情况。整个过程确保了应用程序能够在启动时正确验证许可证,保障系统的安全性与可控性。
818 10
.net8 使用 license 证书授权案例解析
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
789 5
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
1606 2
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
548 2
|
测试技术 API 开发者
精通.NET单元测试:MSTest、xUnit、NUnit全面解析
【10月更文挑战第15天】本文介绍了.NET生态系统中最流行的三种单元测试框架:MSTest、xUnit和NUnit。通过示例代码展示了每种框架的基本用法和特点,帮助开发者根据项目需求和个人偏好选择合适的测试工具。
737 3
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
590 12
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
486 7
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
1383 0

推荐镜像

更多
  • DNS