回顾一下我们前面经过改造后的程序代码:

(1)Listing.aspx:负责将Product对象集合(产品集合)按要求显示出来

(2)Repository.cs:负责读将数据库中读到的数据转换成Product对象

(3)SqlHelper.cs:负责从数据库中读数据。

通过改造后,读数据库、转换、显示三部分分离开了,这样我们的代码结构比较清晰,后面要继续添加订单、购物车等数据页面,可以仿照现在这个结构,做一些改动就可以了。三个模块各司其职,修改起来也容易。

但是,数据库访问部分还是比较麻烦,每增加一个数据表,就要增加一些将数据转换成对象的代码,这些代码除了具体的列名称和类型不一样之外,大部分过程都是一样的。而且每次读数据时,还需要自己写一些差不多的select语句。所以还有进一步改造的余地。下面先看操作步骤。

1.添加Entity Framework类库

在项目SportStoreEx上点击右键,选择“管理NuGet程序包”,按如下步骤安装Entity Framework包:

安装完毕之后,点击SportStoreEx项目下的“引用”节点,看到下图两个条目就表示Entity Framework组件包安装成功:

2.在SportStoreEx项目中删除SqlHelper类,添加一个EFDbContext类,代码如下:

 using System.Data.Entity;
namespace SportStoreEx
{
public class EFDbContext:DbContext
{
public DbSet<Product> Products { get; set; }
}
}

第一行表示引用Entity Framework组件包里的System.Data.Entity命名空间,我们需要用到此命名空间里的DbContext类。

第4行表示我们新增的EFDbContext类继承自DbContext类。

第6行表示在EFDbContext类里面定义一个DbSet<Product>属性。其中,DbSet<T>是一个集合类型,集合里放置的元素的数据类型是T,T代表一个类,我们这里的T就是Product,表示DbSet集合里的每个元素是Product对象。DbSet<T>这种技术叫做泛型,想要更详细了解泛型的知识,请自行搜索资料学习。

我们定义的这个EFDbContext类是代替SqlHelper类的,读写数据库就要靠它了。下面我们看看它的神奇之处。

3.添加数据库连接字符串。

经过第二步这么做了之后,我们的EFDbContext还不知道要去哪里找数据库,要找哪个数据库。我们将数据库的相关信息写在一个配置文件中,这个配置文件就是网站根目录下的Web.config文件。打开该文件,在<configuration>下面添加一个<connectionStrings>节,如下红色字体部分:

 <?xml version="1.0" encoding="utf-8"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
11 <connectionStrings>
12 <add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=SportsStore;Integrated Security=True" providerName="System.Data.SqlClient"/>
13 </connectionStrings>

<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
</system.web>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>

第11-第13行红色标注的就是我们在Web.config文件中所要添加的部分。

注意看第12行<add ... />节点,这里给节点起了个名字name="EFDbContext",这个名字与我们第1步中定义的EFDbContext类的名字必须要一致。正式因为这两个名字一致了,所以.NET Framework平台才知道EFDbContext类所要访问的数据库地址在哪,访问哪个数据库。

还有一点,这一行不能回车,要写在一行上!

4.修改Repository类。

将Repository类代码修改成如下所示:

 using System.Collections.Generic;
using System.Data.SqlClient; namespace SportStoreEx
{
public class Repository
{
EFDbContext context = new EFDbContext();
public IEnumerable<Product> Products
{
get
{
return context.Products;
}
}
}
}

第8行:定义一个EFDbContext对象作为Repository类成员,并将其实例化。这个context对象专门用来进行数据库读写操作。

第9-15行:定义一个IEnumerable<Product>类型的属性,属性名为Products。此属性有一个get访问器,直接返回context对象身上的Products属性成员。

首先,IEnumerable<Product>是一个集合类型的接口,所谓接口,举个简单例子来理解,我们常说苹果是一种水果,这里水果就可以称之为接口,苹果是类。

具体有关接口的通俗解释请看C# 接口《通俗解释》

其次,你也看到了,这里直接返回context.Products。再也没看到创建SqlConnection、SqlCommand这些对象,也不需要写“select ...”这样的sql语句,也不需要你去打开数据库连接,执行读数据操作了。就只要一个context.Products,数据就从数据库的Products表中跑到context对象的Products属性中来了,你都不需要将数据记录一个一个地去转换成Product对象了。

你的工作量是不是一下子少了一大截?这个福利够不够大?

如果你不相信就这么几行代码就能够拿到数据,那可以试着运行一下程序,看看能不能在网页中看到产品列表信息。

那么问题来了,数据怎么一下子就从数据库我们程序里来的?

这个就是Entity Framework的作用。我们的EFDbContext类继承了DbContext类,只需要这一点,我们就使用上EF(Entity Framework的缩写)了。

我们在EFDbContext类里面定义了一个DbSet<Product>属性,EF会自动去SportStore数据库里找Products(注意单复数)这张数据表,所以我们在程序里定义的Product类的名称必须和数据表Products名称保持一致,类名称用单数,数据表名称用复数。此外,Products数据表里的字段名称、类型也必须和Product类中各属性的名称、类型保持对应。遵循这些规则之后,EF就能帮助我们自动将Products数据表中的记录读出来并转换成Product对象放在context对象的Products这个Dbset集合中。

数据表名称一定要和类名称保持一致,类中属性名称也要和表中列名称保持一致,你也许觉得这也太不灵活了。其实你如果想不一致也是可以的,但需要告诉EF类和表之间的对应关系,至于怎么告诉它,这是后话,现在就按上面讲的规则去做,搞清楚基本用法之后再说。

至此,有关Entity Framework的使用入门实验就结束了。

实验四:终极改造之使用EF的更多相关文章

  1. 20155233 《Java程序设计》实验四 Android开发基础

    20155233 <Java程序设计>实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android组件.布 ...

  2. Oracle 实验四-七

    shutdown immediateORA-01097: 无法在事务处理过程中关闭 - 请首先提交或回退 解决:先 "commit" 实验四 SQL Production :: C ...

  3. php实验四

    实验四 1.创建一个Person类,Person中包含三个属性name,age,wealth,分别设置为public,private,protected,再定义Person类的子类Student. 2 ...

  4. 实验四 简单的PV操作

    实验四 简单的PV操作 专业 网络工程   姓名 方俊晖 学号 201406114309 一.        实验目的 1.掌握临界区的概念及临界区的设计原则: 2.掌握信号量的概念.PV操作的含义以 ...

  5. Java实验四

    20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...

  6. 20145316&20145229实验四:驱动程序设计

    20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...

  7. 20145301&20145321&20145335实验四

    20145301&20145321&20145335实验四 这次实验我的组员为:20145301赵嘉鑫.20145321曾子誉.20145335郝昊 实验内容详见:实验四

  8. 20145212 实验四《Andoid开发基础》

    20145212 实验四<Andoid开发基础> 实验内容 安装Android Studio 运行安卓AVD模拟器 使用Android运行出模拟手机并显示自己的学号 实验过程 一.安装An ...

  9. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

随机推荐

  1. 20172322 实验一《Java开发环境的熟悉》实验报告

    172322 2017-2018-2 <程序设计与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师:王志强 ...

  2. 编程之法section II: 2.2 和为定值的两个数

    ====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...

  3. Week4-作业1:《构建之法》第四章、第十七章 阅读笔记与思考

    第四章 两人合作   这一章是讲述了两人结对编程的一些东西,包括一些代码的规范,还有结对编程的优点.怎么做.以及一些注意事项. 1.“错误处理 当程序的主要功能实现后,一些程序员会乐观地估计只需要另外 ...

  4. 信息安全C散列函数的应用及其安全性2016011992

    1:散列函数的具体应用 使用一个散列函数可以很直观的检测出数据在传输时发生的错误. MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验(Checks ...

  5. 关于MUI v0.18.0版本 Table组件里的复选框不能选的解决方案

    前段时间在用MUI的时候,Table组件出现复选框不能选的bug(描述: 点击复选框,点击事件会触发,复选框勾选状态无变化). 解决方法: 用CheckBox组件代替Table组件自带的复选框. 解决 ...

  6. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day5)

    提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 进一步数据整理,写入数据库. 吴慧婷:主页面.查单词页面的改进.背单词界面改进. 陈敏: 单词学习功能及该界面按钮功能 ...

  7. SVM (support vector machine)

    简单原理流程转自:http://wenku.baidu.com/link?url=57aywD0Q6WTnl7XKbIHuEwWENnSuPS32QO8X0a0gHpOOzdnNt_K0mK2cucV ...

  8. PAT 1053 住房空置率

    https://pintia.cn/problem-sets/994805260223102976/problems/994805273284165632 在不打扰居民的前提下,统计住房空置率的一种方 ...

  9. 性能分析_linux服务器CPU_Load Average

    CPU度量Load Average 1.  概念介绍 1.1  Linux系统进程状态 在linux中,process有以下状态: runnable (就绪状态):blocked waiting fo ...

  10. [转帖]Kerberos简介

    1.  Kerberos简介 https://www.cnblogs.com/wukenaihe/p/3732141.html 1.1. 功能 一个安全认证协议 用tickets验证 避免本地保存密码 ...