C#的Entity Framework概念详解

来源:互联网 发布:矢量素材 知乎 编辑:程序博客网 时间:2024/06/16 12:18

一、         实体数据库中的关键概念的定位

实体容器:又称之为“上下文”,有一个或者是多个实体集组成,它是实体框架最外层的概念,在编写与实体进行交互的代码时,总是要先创建一个实体容器的实例,即上下文实例,它类似于“数据库或者是数据集”,它有自己的数据表集合(实体集合

注意实体集实体集合的区别。

实体集合:即相当于一张表

实体集:容纳一个实体以及从这个实体派生的其他实体,如视图是表的一个子集,对照于数据库中的表和视图。

实体:对应于数据表中的表。

属性:对应于表中的字段。

——————上面的框架体系合起来称之为模型

二、 实体框架的层

1、概念层(概念模型)——概念架构定义语言 .csdl

2、 存储层(存储模型)——存储架构定义语言 .ssdl

3、 映射层(映射模型)——映射规范语言     .msl

VS2008之前,我们可以在项目中看到上面定义的三个xml文件,但是在VS2008之后,将上面的三个xml内容存储到一个.edmx的文件中去了。

 

三、 三种数据库的开发模式

采用Entity Framework或者是其他的ORM框架,有时还可以区分三种不同的开发模式。

1、 数据库优先开发模式(Database First Development

首先针对数据库进行设计,在数据库里面定义数据结构,然后在设计entity时,再根据数据库里面的数据结构来生成相对应的实体对象。这与entity编程的第一种编程方式是相对应的。

2、 模型优先开发模式(Model First Development

这是先创建一个空的实体框架,对应于数据库的第二种开发方式,在这个entity中自己定义数据结构,表与表之间的关系,然后将这个实体模型更新到数据库中,既要在数据库中新建一个数据库,然后再在里面创建这些对应着的表。

3、 代码优先开发模式(Code First Development

这是一种新颖的开发方式,就是开发人员根据实际的需求,撰写相应的类别和属性,并且通过ORM框架的管理,转换成实体模型,这也是现在最流行的开发方式。

 

实例——以一个控制台程序来演示

在控制台项目中添加,“右键》添加》新建项》ADO.NET实体数据模型”,然后会弹出一个对话框,如下所示:

从上面可以看见:EF一共提供了几种不同的架构,

第一种:数据库优先的开发模式

第二种:模型优先开发模式

第三种:代码优先开发模式

这三种模式具体是怎么回事参见下图:

可以看见,代码优先的开发模式其实本质上就是一个类,即一个.cs文件。

如下:

namespace EF2

{

   using System;

   usingSystem.Data.Entity;

   usingSystem.Linq;

   usingSystem.Collections.Generic;

 

   publicclassLiteral :DbContext

   {

       //您的上下文已配置为从您的应用程序的配置文件(App.config或 Web.config)

       //使用“Literal”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的

       //“EF2.Literal”数据库。

       //

       //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Literal”

       //连接字符串。

       publicLiteral()

            : base("name=Literal")

       {

       }

 

       //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First  模型

       //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109

 

       // public virtual DbSet<MyEntity>MyEntities { get; set; }

       publicDbSet<Blog> Blogs { set; get; }

       publicDbSet<Post> Posts { get; set; }

 

   }

 

   //public class MyEntity

   //{

   //   public int Id { get; set; }

   //   public string Name { get; set; }

   //}

   publicclassBlog

     {

         publicint BlogId {get; set; }

         publicstring Name {get; set; }

 

         publicvirtualList<Post> Posts { get; set; }

     }

     publicclassPost

     {

        publicint PostId {set; get; }

        publicstring Title {get; set; }

        publicstring Content {get; set; }

 

        publicint BlogId {set; get; }

        publicvirtualBlog Blog {get; set; }

    }

}

从上面的代码可以看出,这与之前的数据库优先原则本质上其实是一样的,首先定义一个实体容器,即上下文,它继承自DbContext然后再上下文中定义两张数据表。

publicDbSet<Blog> Blogs {set; get; }

publicDbSet<Post> Posts {get; set; }

然后再定义这两个表中的属性,即字段。如上面代码。

 

然后在主程序中调用一下试试看:

 

 

namespace EF2

{

   classProgram

   {

       staticvoid Main(string[] args)

       {

            using (var db =newLiteral())

            {

                Console.WriteLine("输入一个新的Blog名称");

                var name =Console.ReadLine();

               

                var blog =newBlog { Name = name };

                db.Blogs.Add(blog);

                db.SaveChanges();

               

                var query =from b in db.Blogs

               orderby b.Name

                select b;

               

                foreach (var itemin query)

                {

                     Console.WriteLine(item.Name);

                }

               }

          Console.ReadKey();

       }

   }

}

结果为:

输入一个新的Blog名称

袁菲

袁菲

 

总结在代码优先的开发模式中,最然将上下文和实体类都写在一个class文件中,带本质实际上和之前的数据库优先和模型优先是一样的,在上面的程序运行之后,会发现,打开SQL Server对象资源管理器,一般数据库会建立在本机的打开数据库默认实例对象上,这个数据库可能是自己安装的数据库,也可能是VS自带的轻量级数据库,但是,一定要记住,只有当数据库中有内容存在的时候,才能够在数据库中查看到他,如果没有在这个数据库中写入任何内容,则连接上数据库之后,并看不到那个数据库存在,在模型优先的开发模式也是这样,一定要写入内容才能看得见。

而且在定义数据实体时可以给每一个属性添加相关的特性来进行约束,就像ASP.NETMVC中一样。

比如我自己的是在:

 

 

上面的这个EF2.Literal就是代码优先生成的数据库。

注意事项:因为在上面的操作中会在默认的数据库实例中创建相对应的数据库,但是如果需要将其迁移到指定的或者自己安装的数据库实例中,则需要用到数据库迁移技术,这里先不讨论。

 

四、 实体框架编程中用到的主要命名空间和相应的一些主要类

1、命名空间:

using System.Data;

using System.Data.Entity;

 

usingSystem.Data.Entity.Core.EntityClient;

using System.Data.Entity.Design;

usingSystem.Data.Entity.Core;

等等

在上面中,使用的最多的就是前面两个命名空间

   

2、常用类

DbContext

DbSet

DbSet<T>

 

0 0
原创粉丝点击