C#的Entity Framework概念详解

  • Post author:
  • Post category:其他



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



实体容器



:又称之为“



上下文



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



实体集合





注意



实体集







实体集合



的区别。



实体集合



:即相当于一张表



实体集



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



实体



:对应于数据表中的表。



属性



:对应于表中的字段。



——————



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





模型





二、


实体框架的层



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;




using


System.Data.Entity;




using


System.Linq;




using


System.Collections.Generic;





public


class


Literal


:


DbContext



{




//


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

或 Web.config)




//


使用“Literal

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




//


“EF2.Literal

”数据库。




//




//


如果您想要针对其他数据库和/

或数据库提供程序,请在应用程序配置文件中修改“Literal”




//


连接字符串。




public


Literal()



:

base


(


“name=Literal”


)



{



}





//


为您要在模型中包含的每种实体类型都添加 DbSet

。有关配置和使用 Code First  模型




//


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





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




public


DbSet


<


Blog


> Blogs {


set


;


get


; }




public


DbSet


<


Post


> Posts {


get


;


set


; }




}





//public class MyEntity




//{




//

public int Id { get; set; }




//

public string Name { get; set; }




//}




public


class


Blog



{




public


int


BlogId {


get


;


set


; }




public


string


Name {


get


;


set


; }





public


virtual


List


<


Post


> Posts {


get


;


set


; }



}




public


class


Post



{




public


int


PostId {


set


;


get


; }




public


string


Title {


get


;


set


; }




public


string


Content {


get


;


set


; }





public


int


BlogId {


set


;


get


; }




public


virtual


Blog


Blog {


get


;


set


; }



}


}


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


DbContext




然后再上下文中定义两张数据表。


public


DbSet


<


Blog


> Blogs {


set


;


get


; }


public


DbSet


<


Post


> Posts {


get


;


set


; }


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



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




namespace


EF2


{




class


Program



{




static


void


Main(


string


[] args)



{




using


(


var


db =


new


Literal


())



{




Console


.WriteLine(





输入一个新的Blog

名称”

);




var


name =


Console


.ReadLine();





var


blog =


new


Blog


{ Name = name };



db.Blogs.Add(blog);



db.SaveChanges();





var


query =


from


b


in


db.Blogs




orderby


b.Name




select


b;





foreach


(


var


item


in


query)



{




Console


.WriteLine(item.Name);



}



}




Console


.ReadKey();



}



}


}


结果为:


输入一个新的Blog

名称


袁菲


袁菲



总结



在代码优先的开发模式中,最然将上下文和实体类都写在一个


class


文件中,带本质实际上和之前的数据库优先和模型优先是一样的,在上面的程序运行之后,会发现,



打开


SQL Server



对象资源管理器,一般数据库会建立在本机的打开数据库默认实例对象上,这个数据库可能是自己安装的数据库,也可能是


VS


自带的轻量级数据库,



但是,一定要记住,只有当数据库中有内容存在的时候,才能够在数据库中查看到他,如果没有在这个数据库中写入任何内容,则连接上数据库之后,并看不到那个数据库存在,在模型优先的开发模式也是这样,一定要写入内容才能看得见。



而且在定义数据实体时可以给每一个属性添加相关的


特性


来进行约束,就像ASP.NETMVC

中一样。


比如我自己的是在:









上面的这个


EF2.Literal


就是代码优先生成的数据库。


注意事项:

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






四、


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



1、


命名空间:


using


System.Data;


using


System.Data.Entity;



using


System.Data.Entity.Core.EntityClient;


using


System.Data.Entity.Design;


using


System.Data.Entity.Core;


等等

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






2、


常用类


DbContext


DbSet


DbSet<T>






版权声明:本文为qq_27825451原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。