学习了ADO.NET的相关知识,掌握了它对数据库表的基本操作,但是实际在开发项目应用中微软为我们开发ef这个ORM,使用它可以很方便的利用ADO.NET来操作DBMS,使得我们开发项目的着重点放在业务逻辑层上面,从而轻数据库的设计。

一:Entity Framework

1 解释

*ef说白了就是对ADO.NET的包装,它可以将数据库中的数据变成实体的模型,也可以将模型变成为数据库中的表,很是方便。

*ef里面重要的就是数据上下文。它是生成数据查询语句的关键。结果实际返回的是IQueryable对象的子类对象,此时返回的DbQuery<T>支持“延迟加载”只有当使用数据库进行查询的时候才会进行数据库的直接查询。

*ef是可以跨数据库的,但是一般情况下我们建大型商城的话不会使用ef的ORM进行,因为它将命令转换为ADO.NET比较慢,一些小型的网站会使用。

2 查询方式分为两种,

0.1:使用SQO(标准查询运算符)进行查询,只是这种查询的结果将来在使用的时候要将返回的DbQuery转回为List<>集合,这样子将来在界面上面好做处理,直接foreach就可以。

//var query = db.Articles.Where(d => d.Title == "我知道你一直在");

//List<Models.Article> list = db.Articles.Where(d => d.Title == "我知道你一直在").ToList();

0.2:使用Linq语句来查询,使用它的好处就是方便编程,其实说到底.net编译器将Linq语句将来也编译为SQO语句进行数

据库的CRUD操作。第二种方式:使用LINQ语句来查询,所有的查询结果,linq只是为了方便程序的编写才出现的,在编译的时候还是编译为上面的第一种方式进行查询。

//IQueryable<Models.Article> query = from d in db.Articles where d.Title == "我知道你一直在" select d;

//List<Models.Article> list = (from d in db.Articles where d.Title == "我知道你一直在" select d).ToList();

3:创建数据上下文

    public partial class ABlogContainer : DbContext
{
public ABlogContainer()
: base("name=ABlogContainer")
{
}
}

4 通过ef如何删除数据库中的数据,在前面提前创建数据上下文db.通过5步来实现删除

0.1:创建类的删除对象   <也就是new一个对象>

0.2:将类的对象添加到ef管理容器

0.3:更改ef管理容器的类的状态,实现删除就是将其状态位改为删除

0.4:保存更改

代码:<1步---5步>

var db=new Ylxy_TwdcDevEntities(); //创建数据上下文

var modelDel=new Articl(){Id=id};   //创建类的删除对象

db.Articles.Attach(modelDel); //将其添加到ef的管理容器

db.Aritcles.Remove(modelDel);//更改其状态位

db.SaveChanges();             //保存数据库的操作。

5 通过ef如何修改数据库中的数据,创建数据库db,执行下面5步

1.1:将实体对象加入到ef管理容器,获取其伪包装类。

1.2:将包装类对象的状态设置为unchange;

1.3:设置被改变的属性

1.4:保存更改。

1.5:跳转页面。

对应代码:

   DbEntityEntry<Article> entity=db.Entry<Aritcle>(model);

   entity.State=Entity.State.Unchange;

   entity.Property(x=>x.Title).IsModified=true;

   entity.Property(x=>x.Content).IsModified=true;

   entity.Property(x=>x.Author).IsModified=true;

   db.SaveChanges();

   Return RedirectToAction(“Index”,”Home”);

6 自动属性

就是在设置属性的时候不需要提前设置属性的值,就是自动属性;

7 隐式类型var和dynameic类型

var就是提前强类型确定好的类型,而dynameic类型就是在运行时确定类型的,对于内存是动态分配内存,属于弱类型。var编译时进行类型推断,在编译阶段得到实际类型,dynamic编译时不进行判断,运行时才判断。

*一般做项目的时候最好将每个方法的无参构造方法,写泛型集合。

*委托就是一种类型,是在方法类型上面的。有了委托就可以将方法当为参数进行传递。

8 ORM是什么

它是一种实体关系数据模型,是一种框架集。

9 ef里面的查询语句,这里面使用的是linq to entity 来进行查询的。

*用lambda表达式进行分页查询

        /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="TKey">按列进行查询</typeparam>
/// <param name="whereLamdba">条件lamdba</param>
/// <param name="orderLamdba">按什么顺序</param>
/// <param name="pageSize">页面大小</param>
/// <param name="pageIndex">页面个数</param>
/// <returns></returns>
public IQueryable<T> GetPageList<TKey>(Expression<Func<T, bool>> whereLamdba, Expression<Func<T, TKey>> orderLamdba,
int pageSize, int pageIndex)
{
return dbcontext.Set<T>().Where(whereLamdba)
.OrderBy(orderLamdba)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize);
}

10 有关延迟加载的问题<导航属性就是数据库中表的关联>

一般情况下我们使用ef的时候不是直接进行数据库的查询的,首先是进行拼接,将其命令保存到表达式的一个二叉树形式,等将查询语句执行完之后在进入数据库中进行查询,而使用查询返回的值是个标量的时候就不会进行延迟加载,比如

count(),First,ToList()等具体的值的时候。当返回的值是一个集合的时候会进行延迟加载。

导航属性的延迟加载:导航属性默认有延迟加载,每当使用导航属性的时候就会进行延迟加载。

11 IQueryable<>和IEnumerable<>的区别

一般会出现延迟加载的是IQueryable<>,因为它是拼接命令,之后才到数据库中执行,而IEnumerable<>是直接执行,比如查询一些连续的命令后者是比较费时的,一步一步的去执行。会出现这样的原因是由于IQueryable<>继承了IEnumberable<>接口,并且新增了Experssion属性,这个属性就会进行命令的拼接。

二:数据库的创建技术

1 Model First

通过模型来新建数据库,主要是每个表之间关系的联系很重要。

数据库中的外键是数据库的一种约束,不是表之间关联的条件。

表之间的关系是数据库设计人员通过分析数据得来的,是通过设置外键来实现的。外键是一个表添加别表主键的操作。

2 Code First

1:引入类库

2:添加上下文类

3:维护原有模型<引入每个标签的命名空间>

*添加模型中类映射到数据库中的表[Table(“表名”)]

*添加主键<key>,外键<ForeignKey(“导航属性”)>,添加导航属性<Virtual,注意表之间关联的类型,一对一,一对多,多对多。每个都不一样注意区分>

[注意]:在写表关系的时候外键(别表的Id)写在“一对多”多的那张表中,在“一”的表中导航属性必须把“多”表写成

集合(ICollection)<>集合。

3 数据库的连接

  <connectionStrings>

    <add name="ABlogContainer" connectionString="Data Source=(Local);Initial Catalog=DemoDb;User Id=sa;Password=1q2w3e4R" providerName="System.Data.SqlClient"/>

  </connectionStrings>

4 数据槽与封装数据上下文方法

*数据槽是一个集合对象,是存储于堆区的。对于ef里面的上下文我们将进行封装,让存储在其数据槽中,这样在大的项目里面不用每次new数据上下文。

*工厂模型是用来封装对象的代码,对于数据上下文我们可以采用其封装上下文,将其放在数据槽里面这样子对于内存是一种节约。

*数据上下文的第二种方法,我们上面的短文中提到了将数据上下文封装到一个方法里,调用数据槽的功能,来实现GC数据上下文的清理。而现在还有一种比较好的方法就是使用using(){}来实现。

 Eg:using(var context=new EFContext()){}

原因:一般我们new一个对象,这个对象长时间没有被使用就会在一段时间之后被GC清理掉,要是我们的项目比较大,那么GC就不知道什么时候才会来清理它,这样子就造成了资源的浪费。DbContext上下文对象的实例占据着数据库的连接,我们希望它不在使用的时候就将其回收掉,using(){}语句有很多好处,第一,当我们执行完using(){}代码块时,上下文中的Dispose()方法会被调用,因为DbContext上下文实现论文IDisposable<>接口,该方法将关闭数据库的连接,清理掉任何需要被释放的资源。这将进一步创建健壮的代码。

5 取数据到内存里面

如果希望将数据直接加载到内存中,可以使用ToList返回一个List<T>对象

三:ef里面的数据迁移

《模型发生更改数据库没变》

Ef的数据迁移是通过NuGet来进行的,在程序包管理器控制台里面输入”get-help EntityFramework”命令,可以获取很多帮助。

Enable-migrations[-Force]  :开始进行数据迁移的准备工作

Add-Migration            :添加模型,更新到数据库中。

Update-Database          :更新数据库

Get-Migration            :从数据库里面得到模型

我们在使用的时候要将默认项目放在Model这个文件下面,这样我们才能执行ef里面的数据迁移。还有就是有的时候我们还需要更改代码里面Configuration.cs文件。

namespace ABlog_Model.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<ABlog_Model.ABlogContainer>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
} protected override void Seed(ABlog_Model.ABlogContainer context)
{
// This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
}

上面的AutomaticMigrationsEnabled = false; 这是我们将数据迁移设置为手动模式,一般我们设置为自动的。

AutomaticMigrationsEnabled = true;

附件:数据迁移知识参考   http://www.cnblogs.com/webabcd/archive/2012/05/30/2525047.html#top

Entity Framework基础01的更多相关文章

  1. Entity Framework 基础

    在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...

  2. ADO.NET 之 Entity Framework 基础

    Entity Framework(EF)是使用直接映射到应用程序中业务对象的对象模型于关系数据库进行交互.它没有将数据视为行和列的集合,而是将其视为强类型对象(成为实体)的集合. 术语:LinQ to ...

  3. Entity Framework 基础操作(1)

    EF是微软推出的官方ORM框架,默认防注入可以配合LINQ一起使用,更方便开发人员. 首先通过SQLSERVER现在有的数据库类生产EF 右键->添加->新建项,选择AOD.NET实体数据 ...

  4. Entity Framework 基础知识走马观花

    本文目录: 一.EF中的edmx文件探秘 二.EF中的代理模式探秘 三.EF中的延迟加载与即时加载 一.EF中的edmx文件 1.1 emdx文件本质:一个XML文件 (1)通过选择以XML方式打开e ...

  5. Entity Framework基础

    http://blog.csdn.net/hurtlingsnail/article/details/53113934

  6. Entity Framework 教程——概述

    Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...

  7. Entity Framework查询生成大量的子查询,如何避免?求救

    最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...

  8. 【Basics of Entity Framework】【EF基础系列1】

    EF自己包括看视频,看MSDN零零散散的学了一点皮毛,这次打算系统学习一下EF.我将会使用VS2012来学习这个EF基础系列. 现在看看EF的历史吧: EF版本 相关版本特性介绍 EF3.5 基于数据 ...

  9. EF是啥?【What is Entity Framework?】(EF基础系列2)

    EF产生的背景: 编写ADO.NET访问数据的代码,是沉闷而枯燥的,所以微软提供了一个对象关系映射框架(我们称之为EF),通过EF可以自动帮助我们的程序自动生成相关数据库. Writing and m ...

随机推荐

  1. ENode 1.0 - 框架的总体目标

    开源地址:https://github.com/tangxuehua/enode 本文想介绍一下enode框架要实现的目标以及部分实现分析思路剖析.总体来说enode框架是一个基于cqrs架构和消息驱 ...

  2. js模版引擎handlebars.js实用教程——each-基本循环使用方法

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  3. 据说每个大牛、小牛都应该有自己的库——Ajax

    蹉跎到今天终于要写Ajax部分了,平时工作中除了选择器我用jQuery的最多的就是ajax,所以这部分在自己的框架中必不可少. XMLHttpRequest 我以为对每个使用过Ajax的人来说XMLH ...

  4. XMPie部署与创建过程 - 快速指南

    XMPie部署与创建过程 1PhotoShop.Indesign.VS2013关系.作用.使用 .1.1目的与过程 1. Photoshop负责导出cpkg文件. 1.1 动态性 如果你想要生成动态的 ...

  5. java.rmi.NoSuchObjectException: no such object in table

    jmx链接的时候,最简单的例子都行不通,郁闷,出现了: 参考:http://reiz6153.blog.163.com/blog/static/401089152009442723208/ 代码: M ...

  6. jsp模仿QQ空间说说的发表

    1.在文本域中输入文字(可以不添加) 2.点击添加图片(可以不添加) 3.点击发表 4.发表成功,文字和图片是超链接,点击就可以查看全部内容 5.点击图片查看原图,没有图片则不显示查看原图的超链接 主 ...

  7. 说说设计模式~观察者模式(Observer)

    返回目录 观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼 ...

  8. EF架构~关于多对多关系表无法更新与插入的问题

    回到目录 在EF里,我们设计模型时,会设计到多对多关系,在EF里会把这种关系会转成两个一对多的关系表,这是比较友好的,因为多对多来说,对于业务本身没什么意思,所以隐藏了,没什么坏处,但对于这个隐藏来说 ...

  9. Java项目——模拟电话薄联系人增删改查

    该项目模拟了电话本记录联系人的业务功能,用来练习对数据库的增删改查等操作. 菜单类:Menu -- 用来封装主菜单和个选项的子菜单 Person类: Person--联系人的实体类 TelNoteRe ...

  10. iOS----Asset Catalog的用法

    文/余书懿(简书作者)原文链接:http://www.jianshu.com/p/7aa06ce22a7b著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 引言 Asset Catalo ...