最近在学习EF,在园子里面参考了很多大神的文章,自己也看了些电子书,为了加深印象和快速掌握,特作此笔记和总结。

一、EF 是什么?

Entity Framework的全称为ADO.NET Entity Framework,是在ADO.NET上层实现的ORM(对象关系映射)封装,其技术架构如下图所示:

1、  Entity Framework的使用分为连接配置关系映射上下文环境定义、数据持久化 四步。

  • 连接配置:如何与数据库进行连接。我们可以通过连接字符串或者代码进行设置和原来连接ADO.Net 连接数据的方式没有什么太大的区别。

  • 关系映射(如上图紫色的部分):

(1)SSDL 称之为存储模型,用于描述 Entity Framework 应用程序的存储体模型。

(2)MSL   称之为关系映射,用于描述Entity Framework 用用程序概念模型和存储模型的对于关系。

(3)CSDL 称之为概念模型,它描述构成数据驱动应用程序的概念模型的实体、关系和函数。

他们都是基于XML语言,具体代码可以查看EDMX文件,这里不在赘述。

  • 上下文环境定义:DBContext 可以理解为是一个容器,里面有对象与数据表的映射关系以及对象本身。
  • 数据持久化:数据持久化就是将内存中的概念模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

2、EF的三种编程模式:

  • DataBase First:开发模式指以数据库设计为基础,并根据数据库自动生成实体数据模型(edmx 文件)。

  • Model First:是指从建立实体数据模型入手,并依据模型生成数据库,从而驱动整个开发流程。该模式也就是业界流行的面向领域的编程模式,它的优点在于,程序员可以用与设计建模相同的思维来进行代码编写,更符合面向对象的思想。Model First与Database First是互逆的,但最终都是输出数据库和实体数据模型

  • Code First:程序员完全通过手动编码,就可以使用Entity Framewokr技术来实现数据访问。该模式的优点在于,支持POCO(Plain Old CLR Objects,简单传统CLR对象),代码整洁,程序员对代码的控制也更灵活自如。

以下是三种开发模式的比较如下图:

三种编程模式,感觉最方便的还是Code First,因此主要专注于Code First 方式的学习。

二、CodeFirst 的代码结构如下图:

三、小试一把CodeFirst:

为了便于全面理解CodeFirst,我们来做一个简单的例子:

1)  首先我们打开VS2012,建立一个空的解决方案:EFCodeFirstSolution

2)  右击解决方案,添加一个控制台程序:CodeFirstConsole,并用Nuget 添加 Entity Framework 5.0 (内部版本4.4)。

利用Nuget 添加Entity Framework 这个包之后,会自动添加另外两引用分别是:System.ComponentModel.DataAnnotations 和 System.Data.Entity。

同时,还会为我们的控制台应用程序添加两个配置 文件,分别是App.config 和packages.config。我们打开App.config 文件后会发现自动添加了一下两个节点:

<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --><section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /></configSections><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><entityFramework><defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"><parameters><parameter value="v11.0" /></parameters></defaultConnectionFactory></entityFramework>
</configuration>

为什么要增加这样的一个自定义配置节点 entityFramework 呢?

经过查阅:EF4.1开始,可以在配置文件中设置appSettings节点来配置数据库初始化上下文,但在EF 4.3中,使用自定义的EntityFramework部分来处理新的设置,实体框架将仍然承认使用旧格式数据库的初始化设置,但建议在可能的情况下迁移到新的格式。

意思就是在我们今后的配置可以在entityFramework 节点下进行配置,当然也支持老的格式。具体有哪些配置可以参考这篇文章:The Entity Framework Configuration Section

至于 packages.config,是Nuget 为我们生成的,意思是你的程序集下是用了哪些包,我们这个就一个EntityFramework。

3) 配置文件中的 <defaultConnectionFactory> 节点, 默认的是使用本地的数据库,就是安装vs的时候,自带的那个数据库。由于我没有安装,而是单独安装的sql2008,因此需要想配置文件增加一个连接字符串节点,来支持对数据库的访问,在配置文件根节点下增加一个<connectionStrings>节点:

  <connectionStrings><add name="BookContext" connectionString="server=.;Initial Catalog=BookDb;User ID=sa;Password=sasa;Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;" providerName="System.Data.SqlClient" /></connectionStrings>

5)右击解决方案,添加一个类库 Model,并添加两个类:Author 类 和 Book 类。

using System;
using System.Collections.Generic;namespace Model
{public class Author{//编号public int AuthorId { get; set; }//作者姓名public string Name { get; set; }//作者生日public DateTime Birthday { get; set; }//作者照片public byte[] Photo { get; set; }//作者简介public string Introduce { get; set; }//著作public List<Book> MyBooks { get; set; }}
}

Author

namespace Model
{public class Book{//书籍编号public int BookId { get; set; }//作者编号public int AuthorId { get; set; }//书籍名称public string BookName { get; set; }//价格public decimal Price { get; set; }//是否热销public bool IsSellFast { get; set; }//作者public Author Author { get; set; }}
}

Book

6)右击解决方案,添加一个类库 DataAccess,也需要引用 EntityFramework及项目中的Model程序集。并添加一个类 BookContext(上下文) 继承于 DBContext,代码如下:

using System.Data.Entity;
using Model;namespace DataAccess
{public class BookContext : DbContext{public DbSet<Author> Authors { get; set; }public DbSet<Book> Books { get; set; }}
}

注意:上下文类名 BookContext 需要与配置文件中连接字符串中的 name="BookContext" 保持一致。(为什么?默认约定,当然也可以不一样,以后文章再说)

7)我们在控制台中程序集中添加 DataAccess 这个项目引用,并在Main 函数编写如下代码:

static void Main(string[] args){try{using (var context = new BookContext()){context.Database.Create();}Console.WriteLine("数据库创建成功!");}catch (Exception ex){Console.WriteLine("数据库失败!");Console.Write(ex.Message);}Console.ReadKey();
}

8)运行一下项目,会发现,控制台提示:“数据库创建成功”,打开Sql Server ,会发现果然 创建出来了 BookDb 这个数据库并包含两张表 Author 和 Book。

这就是Code First 的编程方式,直接在代码中创建实体类,就会通过Entity Framwork 在数据库中创建数据库和表。

但是会发现,数据库中的表的字段类型感觉怪怪的。string 类型在数据库中对应成了 navharchar(max),bety[] 类型变成了 varbinary(max),而且两个表还增加了主键和外键关联。其实这都是EF默认的约定所决定的。

能改吗?当然可以,下面的文章我们就来对这些字段类型进行设定和配置。

--=本文代码下载=--

转载于:https://www.cnblogs.com/lxblog/archive/2013/05/14/3078914.html

Entity Framwork CodeFirst 学习笔记一:EF 概念和初次接触CodeFirst相关推荐

  1. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  2. HTML/CSS学习笔记01【概念介绍、基本标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

  3. 网络流算法学习笔记——最大流问题基本概念和Ford-Fulkerson方法(标号法C++实现)

    屈婉玲<算法设计与分析>第2版第7章网络流算法学习笔记. 基本概念 最大流问题,相当于有从s到t的供水系统,每段路径都有限定流量,除了s.t两地外,每个中间点都不能滞留,从s流入多少,就从 ...

  4. 利用计算机技术实现对文本篇章,自然语言处理NLP学习笔记一:概念与模型初探...

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. 知识图谱: 还有2个实际应用的例子,加深对NLP的理解 九歌机器人: 微软 ...

  5. 学习笔记(二):WiFi-无接触感知与菲涅尔区

    学习笔记(二):WiFi-无接触感知与菲涅尔区 <毫米级的 Wi-Fi 无接触感知:从模式到模型>笔记 整体总结:   本文在理论上揭示和评估什么样的人体行为可被检测以及何时被检测到.具体 ...

  6. TCP/IP详解学习笔记(1)-基本概念

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  7. 冰冰学习笔记:进程概念

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  8. 认知无线电学习笔记1 物理层概念

    认知无线电学习笔记1 认知无线电物理层基础 Physical architecture of the cognitive radio PHY LAYER: 频谱感知(侦听) 接入技术 Radio fr ...

  9. (1)《Head First HTML与CSS》学习笔记---HTML基本概念

    前言: 1.     这本书并没有面面俱到,涵盖所有内容,只提供作为初学者真正需要的东西:基本知识和信心.所以这不是唯一的参考书.(我买了一本<HTML5权威指南>作为参考书和这本一起看, ...

最新文章

  1. 赠书 | 图解机器学习算法,看这文就够了!
  2. 决策树算法从入门到精通
  3. 连鸽14年的哈勃望远镜“继任者”终于发射了!耗资600亿,能给136亿年前星系拍照...
  4. VLAN之间ACL和VACL的区别
  5. RequestDispatcher
  6. 【机器学习】与机器学习算法公式相关的数学家,你认识几个?
  7. ajax无刷新评论的思路,ajax学习——ajax版无刷新评论(数据库)
  8. html5声明utf-8,HTML5中的SVG – 什么时候是XML声明`?xml version =“1.0”encoding =“UTF-8”?`需要吗?...
  9. 即将绝版!小米最经典旗舰降价甩,以后不会再有了
  10. des和aes相比较有哪些特点_高精度的交叉滚子轴承与传统轴承相比较,有哪些优点?...
  11. 岳阳机器人餐厅在哪_普渡科技推出送餐与回盘两款全新餐饮机器人,打造“一来一回”新闭环...
  12. 设A和B是n阶矩阵 ,A,B,A+B均可逆,证明:(A^-1+B^-1)也可逆,并求其逆。
  13. 古剑奇谭服务器维护,古剑奇谭ol7月10日更新维护公告 古剑网络版更新内容汇总...
  14. 2021年山东省安全员C证最新解析及山东省安全员C证证考试
  15. element-ui表格显示html格式
  16. 电主轴编码器测试工具VS sensorikHCU500/DCMU-BOX,海德汉PWM21/PWT101,LENORD+BAUER(L+B)211BSO/211CS04E2M使用对比
  17. python 横坐标只显示部分数据_解决echarts中横坐标值显示不全(自动隐藏)问题
  18. Python学习基础方便查询
  19. 【转载】如果你是ACMer,你会选择哪个职业?(来自shǎ崽)
  20. 使用Tushare筛选今天适合投资的股票

热门文章

  1. MIT新开发的 AI 模型有望改进恶性脑瘤治疗
  2. 展望2021年:智能机器人可监督工业机器人干活,效率提升30%
  3. 直击2018AWE:智能语言交互大厮杀、老品牌争先搭建平台、第三方平台迅速崛起
  4. 2018年,这15个领域将会呈现指数级变化
  5. 清华大学:刘洋——基于深度学习的机器翻译
  6. 感动!盲人计算机科学家研发语音浏览器,致力科技改善盲人生活
  7. Maven学习总结(七)——eclipse中使用Maven创建Web项目
  8. NSURLProtectionSpace 证书认证的上下文
  9. linux中的tasklet机制【转】
  10. 机器学习数据管理初创公司SafeGraph融资1600万美元