EF框架setpbysetp.docx
《EF框架setpbysetp.docx》由会员分享,可在线阅读,更多相关《EF框架setpbysetp.docx(19页珍藏版)》请在冰豆网上搜索。
EF框架setpbysetp
1、EF框架stepbystep
(1)—Database-First
ADO.NETEntityFramework是微软以ADO.NET为基础所发展出来的对象关系对应(O/RMapping)解决方案,现已经包含在VisualStudio2008ServicePack1以及.NETFramework3.5ServicePack1中发布。
目前最新版本为4.1,可以点此下载。
ADO.NETEntityFramework以EntityDataModel(EDM)为主,将数据逻辑层切分为三块,分别为ConceptualSchema,MappingSchema与StorageSchema三层,其上还有EntityClient,ObjectContext以及LINQ可以使用。
在最新4.1版本中,增加了 DbContextAPI及Codefirst,DbContextAPI是基于ObjectContext和其他一些类型抽象出的一个简单的API,并进行了优化。
CodeFirst是基于EntityFramework的新的开发模式,原先只有DatabaseFirst和ModelFirst两种。
CodeFirst先用C#/VB.NET的类定义模型,然后映射到现有的数据库或者产生新的数据库结构。
CodeFirst同样支持通过DataAnnotations或fluentAPI进行定制化配置。
过多的内容就不多说了,框架图下:
简单介绍就到这里,先来构建一个简单的例子,来感受一下这个框架。
这个例子采用简单的Database-First方法.
首先在建一个示例数据库BlogDB,然后创建两张表如下图示:
随便录入一些测试数据。
第二步:
打开VS2010,新建控制台应用程序EFSample
第三步:
右键工程目录,在弹出菜单点击添加新项,添加ADO.NetEntityDataModel,并命名为:
Blog.edmx,如下图示:
在弹出的新窗口,选择Generatefromdatabase,下一步
选择数据连接,并将数据库连接字符串保存在程序中,继续下一步
选择要添加的表,完成,这时就添加好了这个Blog.edmx,这个文件是从数据库自动生成的模型文件,基于xml格式,包含概念模型、存储模型以及这两个模型之间的映射。
如下图示:
这是最后生成的EDM。
最后,打开Program.cs键入代码,如下示。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceEFSample
{
classProgram
{
staticvoidMain(string[]args)
{
IListblogUsers=TestEF.GetAllBlogUsers();
///遍历所有查询结果
foreach(varblogUserinblogUsers)
{
Console.WriteLine(blogUser);
///获取外键对象的内容
foreach(varpostinblogUser.Posts)
{
Console.WriteLine("\t随笔标题:
{0}",post.PostTitle);
}
}
}
}
publicstaticclassTestEF
{
publicstaticIListGetAllBlogUsers()
{
///BlogDBEntities是继承于ObjectContext类,自动生成
///可以打开Blog.Desgner.cs文件找到
///原型:
publicpartialclassBlogDBEntities:
ObjectContext
///可以理解为他代表了当前数据库环境对象
///同时,在Blog.Desgner.cs里还可以找到两个实体BlogUser及Post
BlogDBEntitiesblogDB=newBlogDBEntities();
///采用Linq语法读取数据
IListblogUsers=blogDB.BlogUsers.ToList();
returnblogUsers;
}
}
publicpartialclassBlogUser
{
publicoverridestringToString()
{
returnstring.Format("编号:
{0}姓名:
{1}",this.BlogID,this.BlogName);
}
}
}
复制代码
下面可以运行,测试,效果如图:
2、EF框架stepbystep
(2)—Model-First
2011-05-0313:
59by杨延成,2882visits,收藏,编辑
这一篇主要说一下EF框架中,ModelFirst做法,仍然采用上一篇的案例。
但增加评论功能。
首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示:
点击确定,关闭窗口。
第二步:
在Comment实体上右键,选择Add—ScalarProperty,为这个类添加CommentContent(string类型)属性和PostId(Int32)属性.
第三步:
在左侧工具箱窗口,选择Association,为Post与Comment两个实体添加关联。
具体如下图示:
点击确定,关闭窗口。
最后完成后Blog.edmx如下图示:
第四步:
在Blog.edmx空白处右键,选择GenerateDatabasefromModel...,生成更新数据库的Sql语句,默认的文件名是Blog.edmx.sql。
当然,这个文件里包含了原有的一些表的结构生成代码,各位可以选择,数据库中目前不存在的Comment表及相关约束等语句来执行。
执行完成后,打开服务浏览器窗口,刷新,即可看到新增加的表comment,然后为表添加一些测试数据,注意外键的关联。
最后一步:
当然就是写些代码,测试一下,具体如下:
classProgram
{
staticvoidMain(string[]args)
{
IListblogUsers=TestEF.GetAllBlogUsers();
///遍历所有查询结果
foreach(varblogUserinblogUsers)
{
Console.WriteLine(blogUser);
///获取外键对象的内容
foreach(varpostinblogUser.Posts)
{
Console.WriteLine("\t随笔标题:
{0}",post.PostTitle);
foreach(varcommentinpost.Comments)
{
Console.WriteLine("\t\t{0}",comment.CommentContent);
}
}
}
}
}
publicstaticclassTestEF
{
publicstaticIListGetAllBlogUsers()
{
///BlogDBEntities是继承于ObjectContext类,自动生成
///可以打开Blog.Desgner.cs文件找到
///原型:
publicpartialclassBlogDBEntities:
ObjectContext
///可以理解为他代表了当前数据库环境对象
///同时,在Blog.Desgner.cs里还可以找到两个实体BlogUser及Post
using(BlogDBEntitiesblogDB=newBlogDBEntities())
{
///采用Linq语法读取数据
///通过Include方法将子对象Post预先加载
IListblogUsers=blogDB.BlogUsers.Include("Posts").ToList();
foreach(variteminblogUsers)
{
foreach(varpostinitem.Posts)
{
//对于Comments对象,也进行了预加载
if(!
post.Comments.IsLoaded)
{
post.Comments.Load();
}
}
}
returnblogUsers;
}
}
}
publicpartialclassBlogUser
{
publicoverridestringToString()
{
returnstring.Format("编号:
{0}姓名:
{1}",this.BlogID,this.BlogName);
}
}
复制代码
最后运行效果如下图:
这一篇,其实是采用了DatabaseFirst与ModelFirst混合的作法,这时,要注意命名的规范性,否则可能会引发异常,如果在测试过程中,发现异常,请查看Blog.edm文件(XML格式)的描述是否与数据库的表相匹配,也就是C-Smappingcontent节的配置。
(本文源码:
单击下载)
3、EF框架stepbystep(3)—Code-First
2011-05-0513:
02by杨延成,4183visits,收藏,编辑
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法。
本文采用的示例仍然是前两篇采用的博客用户的示例。
故不在此对业务进行描述。
首先新建一个C#控制台应用程序,并命名为EFCodeFirstSample。
利用Nuget为该项目添加引用EntityFramework4.1的引用。
PM>Install-PackageEntityFramework
复制代码
当然,你也可以用常规的方式,先下载EF4.1安装后,在进行添加。
同时代码中引用命名空间
usingSystem.Data.Entity;
复制代码
第二步:
为项目添加2个实体对象,仍然采用前面所描述过的博客用户及随笔类,代码如下示:
publicpartialclassBlogUser
{
///
///默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
///如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
///
publicintBlogUserId{get;set;}
publicstringBlogName{get;set;}
///
///定义博客用户的随笔列表
///virtual表示该列表为延迟加载
///
publicvirtualICollectionPosts{get;set;}
}
publicpartialclassPost
{
publicintPostId{get;set;}
publicstringPostTitle{get;set;}
publicintBlogUserId{get;set;}
///
///延迟加载博客用户
///
publicvirtualBlogUserBlogUser{get;set;}
}
复制代码
第三步:
定义DbContext
publicclassBlogDbContext:
DbContext
{
publicIDbSetBlogUsers{get;set;}
publicIDbSetPosts{get;set;}
}
复制代码
第四步:
编写测试代码
using(vardb=newBlogDbContext())
{
//向数据库添加记录
varblogUser=newBlogUser(){BlogUserId=1,BlogName="燕赤霞"};
db.BlogUsers.Add(blogUser);
varpost=newPost(){PostId=1,
PostTitle="一切皆有可能--我与小倩不得不说的事",
BlogUserId=1};
db.Posts.Add(post);
//保存记录,返回受影响的行数
intrecordsAffected=db.SaveChanges();
Console.WriteLine("追加{0}记录成功",recordsAffected);
}
复制代码
好了,写到这里可以运行测试了,运行结果如下:
你可以打开数据库管理器,可以找到
EFCodeFirstSample.BlogDbContext数据库,他包含BlogUsers表和Posts表,并且建立了主外键关系
完整代码如下:
完整代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Data.Entity;
usingSystem.ComponentModel.DataAnnotations;
namespaceCodeFirstSample
{
classProgram
{
staticvoidMain(string[]args)
{
using(vardb=newBlogDbContext())
{
//向数据库添加记录
varblogUser=newBlogUser(){BlogUserId=1,BlogName="燕赤霞"};
db.BlogUsers.Add(blogUser);
varpost=newPost(){PostId=1,
PostTitle="一切皆有可能--我与小倩不得不说的事",
BlogUserId=1};
db.Posts.Add(post);
//保存记录,返回受影响的行数
intrecordsAffected=db.SaveChanges();
Console.WriteLine("追加{0}记录成功",recordsAffected);
}
}
}
publicpartialclassBlogUser
{
///
///默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
///如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
///
publicintBlogUserId{get;set;}
publicstringBlogName{get;set;}
///
///定义博客用户的随笔列表
///virtual表示该列表为延迟加载
///
publicvirtualICollectionPosts{get;set;}
}
publicpartialclassPost
{
publicintPostId{get;set;}
publicstringPostTitle{get;set;}
publicintBlogUserId{get;set;}
///
///延迟加载博客用户
///
publicvirtualBlogUserBlogUser{get;set;}
}
publicclassBlogDbContext:
DbContext
{
publicIDbSetBlogUsers{get;set;}
publicIDbSetPosts{get;set;}
}
}
4、EF框架stepbystep(4)—DBcontext应用于已存在数据库
2011-05-0614:
23by杨延成,3062visits,收藏,编辑
EF4.1有三种方式来进行数据操作及持久化。
分别是Database-First,Model-First,Code-first,
前面都已经简单介绍过了.下面简单小结一下:
1.DatabaseFirst是基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,
数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。
2.ModelFirst这种方式是先利用某些工具(如VS的EF设计器)设计出实体数据模型及他们之间的关系,
然后再根据这些实体、关系去生成数据库对象及相关代码文件。
3.CodeFirst这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创
建数据对象,这种方式在前一篇文章已经简单说过了。
但其实这种方法与ModelFirst是非常类似的。
我们自己写的代码,其实就是用代码表示实体模型,而ModelFirst是用可视化的方式描述了实体模型。
codeFirst方法默认情况下是以命名空间.DBcontext类名来作为自动创建的数据库名称,如上一篇
中的CodeFirstSample.BlogDbContext.
我们也可以按如下方法指定数据库名称:
publicclassBlogDbContext:
DbContext
{
///
///新建数据库,并命名为BlogDB,
///
publicBlogDbContext():
base("BlogDB"){}
publicIDbSetBlogUsers{get;set;}
publicIDbSetPosts{get;set;}
}
复制代码
codeFirst这种方式也可以用于已存在的数据库,具体作法如下:
第一步:
在app.config或者web.config中配置数据库连接字符串
connectionString="DataSource=.\sqlexpress;InitialCatalog=MyBlogDB;IntegratedSecurity=True"/>
复制代码
第二步:
是让DBcontext获取已存在数据库,在构造DBcontext时,指定使用这个连接字符串
publicclassBlogDbContext:
DbContext
{
///
///会在app.config或者web.config文件中查找BlogDB节,做为连接字符串
///但数据库中必须已存在表,即不会重新创建表,这种方法类似DataBaseFirst
///
publicBlogDbContext()
:
base("name=BlogDB")
{}
publicIDbSetBlogUsers{get;set;}
publicIDbSetPosts{get;set;}
}
复制代码
第三步:
添加要匹配的类以及匹配关系。
publicpartialclassBlogUser
{
publicintBlogUserId{get;set;}
publicstringBlogName{get;set;}
publicvirtualICollectionPosts{get;set;}
}
publicpartialclassPost
{
publicintPostId{get;set;}
publicstringPostTitle{get;set;}
publicintBlogUserId{get;set;}
publicvirtualBlogUserBlogUser{get;set;}
}
复制代码
第四步:
获取数据
using(BlogDbContextdb=newBlogDbContext())
{
//通过主键查找用户
BlogUserblogUser=db.BlogUsers.Find(4);
Console.WriteLine(blogUser.BlogName);
foreach(variteminblogUser.Posts)
{
Console.WriteLine("\t{0}",item.PostTitle);
}
}
复制代码
这种方式其实是DatabaseFirst,只是用我们自己写的类替换了由可视化工具生成类及xml文件。