一、 实体数据库中的关键概念的定位
实体容器
:又称之为“
上下文
”,有一个或者是多个实体集组成,它是实体框架最外层的概念,在编写与实体进行交互的代码时,总是要先创建一个实体容器的实例,即上下文实例,它类似于“数据库或者是数据集”,它有自己的数据表集合(
实体集合
)
注意
实体集
与
实体集合
的区别。
实体集合
:即相当于一张表
实体集
:容纳一个实体以及从这个实体派生的其他实体,如视图是表的一个子集,对照于数据库中的表和视图。
实体
:对应于数据表中的表。
属性
:对应于表中的字段。
——————
上面的框架体系合起来称之为
“
模型
”
二、
实体框架的层
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>