【EF 1】EF实体框架 原理+实例
一、知识回顾
到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的帮助类:SQLHelper。
在这个转变中,已经逐步由面向过程转向面向对象,但在分层操作实体的过程中,由于数据库的设计不很完美,有时候需要修改数据库设计,或者需要更改实体。每次遇到这样的事儿,就脑袋疼,因为数据库和实体必须要对应起来,不然问题就越改越大了。
那么怎样解决这一问题呢?最近学习了一个EF实体框架知识,解决了这一问题。
首先,回顾一下这之前的数据库链接操作。也就是运用ADO.NET进行操作,主要经历5个步骤:建立连接—打开—创建命令—执行—关闭。如:
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;"> private void button1_Click(object sender, EventArgs e)
{
string conStr = @"server=.;uid=sa;pwd=123456;database=shoppingBus";//连接字符串
SqlConnection sqlconnection = new SqlConnection(conStr);//建立连接
sqlconnection.Open();//打开链接
string str = "select * from petType";
DataTable dt = new DataTable();
SqlDataAdapter sqldataadapter = new SqlDataAdapter(str,sqlconnection);//执行命令,读取数据
sqldataadapter.Fill(dt);//填充表格
this.dataGridView1.DataSource = dt;
sqlconnection.Close();//关闭链接
}</span></span>
二、EF实体框架
2.1,什么是?
实体框架(Entity Framework)是微软以ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句当中解放出来。 相对于传统的ADO等各种数据库操纵技术来说,微软的ADO.Net更为先进,它封装了很多底层操作,抽象了接口,针对接口编程,将调用统一化。
2.2,好处(个人理解)
我认为实体框架的好处是,当我们需要修改数据库或者实体时,能够通过实体模型的及时更新解决实体对应映射问题,而不用像之前一样一个一个的对照着修改。而且,它的跨数据库应用实践更为方便,只需要更改配置文件中的数据即可,可以直接将模型生成应用程序数据库到对应数据库服务中。
2.3,应用
2.3.1,准备工作
首先,实在VS中建立新项,添加新建项—数据—ADO.NET实体数据模型,然后设置其自己想要的映射的数据集,设置成功后,会生成一些列文件:
如上图所示,这就是我测试用的shoppingBus数据库生成的实体映射。其中有3个重要的类,分别是:
dataModel.Context.tt下的dataModel.Context.cs类,这个类是包含的数据库的上下文关系,我当时在看的时候就想到了设计模式策略模式中的context类,我认为它们有着共同之处,都是负责数据间的交互和实现。
DataModel.tt下的数据表类,比如这里的就是pet.cs类和petType.cs类。这里就是相当于具体的实体类,值得特别说明的是,EF生成的实体映射同时包括表关系,主外键的关系等。
2.3.2,实践
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;"> static void Main(string[] args)
{
//第一步:创建EF访问数据库的统一入门,上下文:DbContext
shoppingBusEntities1 dbcontext = new shoppingBusEntities1(); #region 增、删、改
//第二步:插入一条数据,添加一个宠物类型
pet pet = new pet();
pet.petID = "003";
pet.petName = "人";
pet.petPrice = 19; //第三步:修改数据,设置状态
dbcontext.Entry<pet>(pet).State = EntityState.Modified;//增、删、改,直接修改实体的状态即可
#endregion #region 查询 var temps = from p in dbcontext.pet
where p.petID == "001"
select p;//查询全部列
//select p.petName;//查询部分列
foreach (var myPet in temps)
{
Console.WriteLine(myPet.petID + " " + myPet.petName +" "+myPet.petPrice);
} #endregion //第四步:命令把所有的变化都更新到数据库里面去
dbcontext.SaveChanges();
}</span></span>
说明:向原来用的SQL链接数据库操作数据一样,EF实体也有自己的逻辑步骤,则是:建立访问入口(上下文)—整理自己的数据—告诉上下文需要执行的操作—保存自己的操作。可以看到,尤其是在增、删、改的过程中,没有看见任何的SQL语句,但其实是由编译器先帮我们翻译成了SQL的脚本。所以,使用EF操作数据库和使用之前的方法操作数据库,主要的区别则是在转换脚本这一过程中的不同,EF需要转换,而之前的方法不需要。
三、总结
根据自己目前的理解,我觉得EF实体映射其实已经脱离了对数据库的一个操作。我们操作的应该是实体,然后通过实体映射给数据库。所以是进一步和数据库解耦和了,达到了一个真正的面向对象。
而使用EF实体还有好处就是,可以动态的更新实体和数据库的映射关系,从而就不用向原来一样费神费力的去两边对照修改。可以由数据库端更新,然后直接更新实体映射,也可以是更改实体映射,然后更新数据库。由于EF实体操作并不直接操作数据库,所以它在跨数据库操作方面(更改配置文件中的provider的提供方式),也有着自己的优势。
【EF 1】EF实体框架 原理+实例的更多相关文章
- 【MVC 1】MVC+EF实体框架—原理解析
导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...
- EF学习-获取实体框架01
实体框架由 EF 设计器(包含在 Visual Studio 中)和 EF Runtime(在 NuGet 上提供)组成. EF 设计器包含在 Visual Studio 中 最新版本的实体框架设计器 ...
- 【U+B+D】三层框架 原理+实例
导读:三层的学习,也终于得到收获了.这个过程很艰辛,不止一次的想放弃.在这一个学习过程中,真的很感谢师傅的尽心.耐心.费心.其实真的很脆弱,现在回想起来都很不可思议. 一.基本概况 1,什么是三层 我 ...
- Config File Settings Of EF——实体框架的配置文件设置
我亦MSDN 原文地址 http://msdn.microsoft.com/en-us/data/jj556606 Entity Framework allows a number of settin ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- EF实体框架之CodeFirst一
对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...
- EF实体框架处理实体之间关联关系与EF延迟机制(下)
在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...
- Entity Framework(实体框架 EF)
什么是Entity Framework呢(下面简称EF)? EF(实体框架)是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架.ORM(对象关系映射框架):指的是面向 ...
- 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移
我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...
随机推荐
- AJPFX关于VIM的常用快捷键
Ajax技术的核心是XMLHttpRequest对象(简称XHR),var xhr = new XMLHttpRequest();function createXHR(){if (typeof XML ...
- phpmyadmin 出现Table 'root.pma_table_uiprefs' doesn't exist
原文链接:http://zhidao.baidu.com/link?url=ugBKDds94yxWhh_IZ6rZWZYSd2nO555EZ1WMClXRrqL0aKLc-HPDrZVSKZyDaD ...
- tar打包压缩命令
1. tar命令 用法: tar [选项...] [FILE]... GNU ‘tar’将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件. 示例 tar -cf archiv ...
- DVWA之跨站请求伪造(CSRF)
CSRF全称是Cross site request forgery ,翻译过来就是跨站请求伪造. CSRF是指利用受害者尚未失效的身份认证信息(cookie,会话信息),诱骗其点击恶意链接或者访问包含 ...
- android Random的使用
一.Random 此类的实例用于生成伪随机数流.此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改. 如果用相同的种子创建两个 Rando ...
- 设置office首字母不变大小的手段
选项->校对—〉自动更正选项->“自动更正”页,句首字母大写,取消就行了
- Selenium私房菜系列9 -- Selenium RC服务器命令行参数列表【ZZ】
本文转载自:http://wiki.javascud.org/display/SEL/Selenium+Remote+Control+-+options 使用示例: java -jar seleniu ...
- decompressedResponseImageOfSize:completionHandler:]_block_invoke
原因: It turns out the linker error was caused by the CGImageSourceCreateWithData call. And the root ...
- Codeforces Round #316 (Div. 2) C Replacement 扫描法
先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数. 对于询问,只要对应位置判断一下是不是'.',以及周围的情况. #include<bits/stdc++. ...
- 机器学习之 PCA (二)
参考 http://www.cnblogs.com/frombeijingwithlove/p/5931872.html