EF到底是什么?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

edmx文件的代码树如下:

①怎么会是XML文件?

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

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

  数据库上下文类。

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

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

  实体类。

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

  1. //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. //创建数据库上下文类的对象
            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 p in db.BlogArticles where p.AIsDel == false select p).ToList();  
    
                //使用ViewData来传递list对象
                ViewData["DataList"] = list;  
    
                return View();
            }
            #endregion  

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

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

然后显示数据的代码是:

  1. <!------------获取数据并显示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>  

运行的结果如下:

三,总结

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

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

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

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

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

时间: 2024-07-31 14:34:52

EF到底是什么?的相关文章

.NET深入实战系列--EF到底怎么写过滤条件

本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// <summary> /// 只是简单举例,只用了两个过滤条件 /// </summary> IEnumerable<UserInfo> Search(string username = "", string usertype = "&

.NET深入实战系列--EF到底怎么写过滤条件(转)

原文来自:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// <summary> /// 只是简单举例,只用了两个过滤条件 /// </summary> IEnumerable<UserInfo> Search(string username = "", string usertype = ""

EF级联删除

引言     在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图中显示只用[required]特性后生成的外键没有级联删除动作.   看似正确的解决方案.(治标的处理方式) 版本:EF6.0.1 RC 一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项:  √ 需要保证DbContext中已经加载了该父对象的所有子

Entity Framework

学习一种新技术的思路: 首先,要明确这种新技术是解决什么问题的,所需要的基础知识是什么: 其次,这种技术是如何解决这个问题的,从概念上来讲,是什么结构,是如何运行的: 再次,这些概念具体的实现也就是对应的类库中有哪些类.接口等,这些类.接口对应哪些概念,具体的方法是什么,如何在自己的项目中运用. 比如说,以EF为例: 首先,EF是一种ORM,解决的问题是对象和关系之间的映射问题,为什么要在对象和关系之间进行映射呢?其实理解新技术要解决什么问题这一点最难,因为我没有遇到过这种问题,所以也很难理解这

[原创]Entity Framework查询原理

前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.Entity Framework的主要特点:1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2):2. 强劲的映射引擎,能很好地支持存储过程:3. 提供Visual Studio集成工具,进行可视化操作:4. 能够与ASP.NET, WPF, WCF, WCF

三层架构的一点理解以及Dapper一对多查询

1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI,BLL,DAL.之前往往强调的是三层架构各司其职,但没有说三层架构中每层之间怎么交互的,以及人员之间的分工合作问题.今天重点说这个,从而回答面向对象和EF的关系. 今天说的与数据库有关,那就先说BLL和DAL之间数据的传递.有不少都是按照以下两种方式写的: (1)以Datatable传递.可想想,

客家话规范的年客家话规范的

http://www.gettyimages.cn/newsr.php?thekeyword=%20%CF%C9%CC%D2%C3%D4%D2%A9%C4%C4%C0%EF%C2%F2Q%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A8%7C http://www.gettyimages.cn/newsr.php?thekeyword=%A1%FD%CC%EC%C3%C5%C3%D4%D2%A9%C4%C4%C0%EF%

手刃崖戮温v3v3pzjqa3ner81u

http://www.qiushibaike.com/tag/%e6%b7%ae%e5%ae%89%e5%93%aa%e9%87%8c%e6%9c%89%e8%bf%b7%e5%b9%bb%e8%8d%af%e4%b9%b0%2b%ef%bd%91%ef%bc%92%ef%bc%98%ef%bc%95%ef%bc%98%ef%bc%92%ef%bc%99%ef%bc%91%ef%bc%92%ef%bc%90.http://www.qiushibaike.com/tag/%e5%93%aa%e5%

后个不停

http://www.wasu.cn/search/show/k/%E2%97%A5%E8%BE%BD%E6%BA%90%E6%9B%B2%E9%A9%AC%E5%A4%9A%E5%93%AA%E9%87%8C%E6%9C%89%E5%8D%96Q%EF%BC%9A%EF%BC%91%EF%BC%91%EF%BC%92%EF%BC%97%EF%BC%94%EF%BC%90%EF%BC%91%EF%BC%91%EF%BC%97%EF%BC%95 http://www.wasu.cn/search/