【EF】Entity Framework使用

1、EF框架之三种模式

  Entity FrameworkORMapping的一种具体实现,ORMapping又是什么呢?html

  ORM--ObjectRelation Mapping,即对象关系映射框架/数据持久化框架,是根据实体对象操做数据表中数据的一种面向对象的操做框架。
sql

       其实Entity Framework的底层也是调用Ado.Net,它是更高层次的封装。做为数据访问的技术,EntityFramework的设计有高扩展性,这一点可体如今其映射定义的灵活性。数据库

简单地说,使用Entity Framework能够充分地定义与数据表映射的实体,这个实体能够直接用于业务逻辑层或做为服务的数据契约。编程

使用EF后,能够将实体类的设计工做彻底放在EDM的设计过程当中,而不须要手工写那些大同小异的代码,使人欣喜的是这个实体模型能够在运行时修改并生效,作到一改全改。网络

咱们开发时也不用再频繁地与数据库打交道,咱们操做实体模型的同时EF框架自动完成了对数据库的操做。数据结构

        对于一种新了解的技术,了解宏观是必须的,可是要想尽快熟悉仍是要实践一下的,咱们知道网络上特别流行Codefist,下面就来讲一说EF框架划分的模式:架构

  • DataBase First(数据库优先)
  • Model First(模型优先)
  • CodeFirst(代码优先)

  固然,若是把Code First模式的两种具体方式独立出来,那就是四种了。app

  一、DataBase First 传统的表驱动方式建立EDM,而后经过EDM生成模型和数据层代码。除生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。在设计器中逆向生成Model,并有Model自动生成全部的类。框架

  二、Model First 先建立EDM模型,再生成DDL数据库脚本和模型和数据层代码。除生成实体模型和自跟踪实现模型,支持生成轻型DbContext。在设计器中建立Model,并用Model生成数据库,全部的类由Model自动生成ide

  三、Code First(New DataBase) :在代码中定义类和映射关系并经过model生成数据库,使用迁移技术更新数据库。

  四、Code First(Existing DataBase):在代码中定义类和映射关系,给逆向工程提供工具。  

虽然Code First灵活,可是需手动建立POCO模型,数据层DbContext及映射关系,经过Database.SetInitializer生成数据库,这种方式较灵活,可是代码工做较多。

2、EF三种编程方式的区别

  • datebase  first就是表明数据库优先,那么前提就是先建立数据库和表
  • model first就是表明model优先,那么前提也就是先建立model,而后根据model自动创建数据库和表

这两EF的编程方式在使用的过程当中的区别为:

一、添加新建项->添加ADO.NET实体数据模型的时候,database  first选择的是从数据库生成。而Model  first选择的是空模型生成

  数据表的主键、外键,提早在DB设计中设置好。

  而且在数据结构发生变化的时候,database  first编程方式中是选择从数据库更新模型,model  first选择的是从模型生成数据库

  modelFirst模式,若代码已经生成好了,切换到另外一台电脑上执行时,还没有有数据库。

则在sql文件中右键:执行,则会自动建立数据表【不过首先在db中手动建一个数据库】。

注:只有第一次才能这样操做,否则执行sql会将原表中的数据删除掉(drop table),更新表结构时应该本身写sql更新

 

  •  code  first就不须要建立一个ADO.NET实体模型的过程,直接在model里面写实体类和dbcontext上下文类

在Code-First中,默认生成的数据库表的名称为类型的复数形式,如Model名为“Player”,默认生成的数据库表名为“Players”。不少状况下咱们并不想生成的数据库表名为复数形式,如何来控制呢?

在public class DBContext : DbContext重写如下方法(去除复数的约束)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();  
}

3、EF三种编程方式实践

   一、Database First

Entity Framework4.1以前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下EF三种编程方式。

开始介绍这三种EF操做方式以前,首先在Visual Studio 中创建一个数据库链接,这里咱们以“EFDemo”数据库为例:

你可使用EF设计工具根据数据库生成数据数据类,你可使用Visual Studio模型设计器修改这些模型之间对应关系。

首先建立一个控制台应用程序,而后右键添加新建项,选择“ADO.NET Entity Data Model”,名称输入EFDemoDB:接着选择从数据库生成:下一步选择数据库链接,

建立完模型以后。你会发现Visual Studio自动为你生成了“Class、“Student”两个实体类和一个“EFDemoDB”数据库上下文操做类:

   二、Model First

此种方式,当须要增长表、更新表(增长字段)的时候

即更新模型(EF里model生成步驟)

  • 在edmx文件中 添加相应的表(实体)和字段(标量属性),记得添加注释【将显示在代码的Model注释上,sql文件里面不会有】,导航属性不用手动添加。

注意,属性中,实体集名称(本身定义)才是表的名字;

       

  • 要添加表关系映射,在edmx空白处右键,选择新建=》关联,在弹出框里选择对应关系(多重性就是一对多什么的,关联是选择与哪一个表进行关联)【导航属性会自动添加上】

注意:源是主表,目标是附表;

若 主键字段不是 用作两表匹配的字段,则须要设置一对多,若主键字段是用作两表匹配的字段,则能够不设置为一对多。 

属性-》引用约束中 设置两个表相等的字段

  • 在右建點擊edmx裡的模型,選擇從模型生成數據庫,即更新sql文件
  • 右键Model1.Context.tt,而后点击运行自定义工具; 或者手动 修改tt文件里面的对应表的属性
  • 編譯生成OK

5.再执行相應的sql腳本【提早建好 或者采用生成的SQL文件里的】,添加相應的表或字段

 三、Code First

此种方式,不须要提早建立数据表,彻底从代码开始。参考:Code First如何使用

4、EF加载方式

  EF加载数据的方式,有预加载、延迟加载、显式加载、按需加载。不一样的加载方式都有不一样的适用状况,不能说哪一种方式好哪一种方式很差。但有一点是须要遵循的,那就是如何提升数据加载的效率。

一、延迟加载又叫惰性加载(Lazy Loading):即在须要或者使用的时候加载数据。默认状况下,EF会使用延迟加载方式加载数据,即数据库上下文的属性:Configuration.LazyLoadingEnabled = true;

  eg:var customers = from c in dbcontext.Customer select c;

二、预加载:若是你想让全部数据一次性所有加载到内存中,那么你须要使用.Include(Entity)方法 。.Include(Entity)方法容许级联使用,你能够预先加载具备多层级结构的数据。

  eg:var q = from t in dbcontext.Customer.Include("Order") select t;

比较两种加载方式

预加载:

• 减小数据访问的延迟,在一次数据库的访问中返回全部的数据。不过缺点是,那就是若是数据量较大,一次性将全部数据载入内存每每并非最明智的选择
• 减小与数据库的交互次数
延迟加载:

• 很是宽容,由于只在须要的时候加载数据,不须要预先计划
• 可能会由于数据访问的延迟而下降性能,考虑到每访问父实体的子实体时,就须要访问数据库。

三、显式加载和延迟加载很是相似,不一样的是显式加载要手动关闭EF的延迟加载属性,经过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。

dbcontext.Configuration.LazyLoadingEnabled = false;
            #region 显式加载:查询部分列数据,前提关闭 懒加载
            //查询表中部分列的数据
            var items = from c in dbcontext.Customer
                        select c;
            foreach (var item in items)
            {
                //条件判断,只加载知足条件的数据,减小访问数据库的次数
                if (item.Id < 5)
                {
                    dbcontext.Entry(item).Collection(c => c.Order).Load();
                    Console.WriteLine(item.CusName);
                }
View Code

四、按需加载

  其实EF并不存在按需加载的概念,可是这种方式很值得说一说,在加载数据的时候并非须要全部的属性值,可能只须要一个Id,Name值。

因此咱们能够对要查询的实体进行一下筛选,只加载本身须要的某些列,避免加载大量的垃圾数据。在这里按需加载的概念只是加载须要的列

  #region 按需加载:查询部分列数据
            //查询表中部分列的数据
            var items = from c in dbcontext.Customer
                        where c.Id < 10
                        select new { Id = c.Id, CName = c.CusName, OrderCount = c.Order.Count() };
            foreach (var item in items)
            {
                Console.WriteLine(item.CName);
            }
            #endregion
View Code

参考:EntityFramework循循渐进

 

其余参考

Entity Franmework系列教程汇总

EF实体框架之CodeFirst

EF架构~系列目录

 

 

转载于:https://www.cnblogs.com/peterYong/p/10275491.html