学习了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. 《你必须知道的.NET》读书笔记一:小OO有大智慧

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象  (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...

  2. VS2012下配置MPI

    并行处理结课实验,要用到MPI编程,我的电脑和VS2012都是64位的,以为MPICH也得是64位才行,结果饶了很大的弯——配置正确,添加引用之后,仍然无法识别MPI函数. 后来换了个32位的MPIC ...

  3. 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性

    作为一名程序猿,拥有自己的个人网站,是一件多么有逼格的事~~至于个人网站的好处嘛?那是多的说都说不完啊~~例如我们可以放自己的作品,展示自己的风采,放自己女神的照片(女神看到后会怎么样,自己想吧,哈哈 ...

  4. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  5. Unity3D热更新全书-脚本(一) 初识脚本

    开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...

  6. python property

    python property 在2.6版本中,添加了一种新的类成员函数的访问方式--property. 原型 class property([fget[, fset[, fdel[, doc]]]] ...

  7. AT&T Assembly on Linux

    je if equal then jmp jg if the second gt the first, then jmp jge if the second ge the first, then jm ...

  8. hibernate HQL和Criteria

    package com.test; import java.util.Date; import java.util.List; import org.hibernate.Query; import o ...

  9. Java线程:创建与启动

    Java线程:创建与启动 一.定义线程   1.扩展java.lang.Thread类.   此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...

  10. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth

    Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...