zoukankan      html  css  js  c++  java
  • 实验四:终极改造之使用EF

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

    (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类,代码如下:

    1 using System.Data.Entity;
    2 namespace SportStoreEx
    3 {
    4     public class EFDbContext:DbContext
    5     {
    6         public DbSet<Product> Products { get; set; }
    7     }
    8 }

    第一行表示引用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>节,如下红色字体部分:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!--
     3   有关如何配置 ASP.NET 应用程序的详细信息,请访问
     4   http://go.microsoft.com/fwlink/?LinkId=169433
     5   -->
     6 <configuration>
     7   <configSections>
     8     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
     9     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    10   </configSections>
    11   <connectionStrings>
    12     <add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=SportsStore;Integrated Security=True" providerName="System.Data.SqlClient"/>
    13   </connectionStrings>
    14   <system.web>
    15     <compilation debug="true" targetFramework="4.5.1" />
    16     <httpRuntime targetFramework="4.5.1" />
    17   </system.web>
    18   <entityFramework>
    19     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    20       <parameters>
    21         <parameter value="mssqllocaldb" />
    22       </parameters>
    23     </defaultConnectionFactory>
    24     <providers>
    25       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    26     </providers>
    27   </entityFramework>
    28 </configuration>

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

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

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

    4.修改Repository类。

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

     1 using System.Collections.Generic;
     2 using System.Data.SqlClient;
     3 
     4 namespace SportStoreEx
     5 {
     6     public class Repository
     7     {
     8         EFDbContext context = new EFDbContext();
     9         public IEnumerable<Product> Products
    10         {
    11             get
    12             {
    13                 return context.Products;
    14             }
    15         }
    16     }
    17 }

    第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的使用入门实验就结束了。

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/bayes/p/6030529.html
Copyright © 2011-2022 走看看