EF框架setpbysetp.docx

上传人:b****7 文档编号:10439421 上传时间:2023-02-11 格式:DOCX 页数:19 大小:399.58KB
下载 相关 举报
EF框架setpbysetp.docx_第1页
第1页 / 共19页
EF框架setpbysetp.docx_第2页
第2页 / 共19页
EF框架setpbysetp.docx_第3页
第3页 / 共19页
EF框架setpbysetp.docx_第4页
第4页 / 共19页
EF框架setpbysetp.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

EF框架setpbysetp.docx

《EF框架setpbysetp.docx》由会员分享,可在线阅读,更多相关《EF框架setpbysetp.docx(19页珍藏版)》请在冰豆网上搜索。

EF框架setpbysetp.docx

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文件。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1