基本概念

EntityFramework是微软推出的一款ORM工具,关于ORM的概念请参考博客https://www.cnblogs.com/huanhang/p/6054908.html。这篇文章对ORM进行很详细的介绍。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

在.NET3.5之前我们从数据库检索或者存储数据的方式经常都是ADO.NET。操作数据会经历如下步骤,打开数据库连接,创建一个数据集来获取或提交数据到数据库,将数据集中的数据转换为.NET对象。或者反过来应用业务规则。这是一个繁琐且重复的工作,或许会有一些Helper来帮助我们解决数据库连接方面的工作,但是数据集到领域对象的过程是我们需要一次次去映射的。所以,ORM工具就提供给了我们操作业务对象,由ORM对我们操作的对象进行数据库操作映射。EntityFramework就是这样的一种工具,我们使用Linq操作领域对象,EntityFramework会帮我们将对应操作转换为SQL语句,然后连接到数据库执行。这样我们就可以在更高的抽象层面来处理数据,并且与传统应用程序相比,可以用更少的代码创建和维护面向数据的应用程序。关于EntityFramework的概念和介绍可以参考MSDN或者http://www.entityframeworktutorial.net/what-is-entityframework.aspx。以上部分概念也来源于此网站。另外,EntityFramework Core为EF垮平台版本。好了,下面进入EntityFramework的具体使用部分。

EntityFramework的3中使用模式

EntityFramework有3中使用模式

  1. DataBase First:从数据库开始,在数据库已经存在的情况下。通过数据库结构构建实体映射对象,并生成映射元数据
  2. Model First:使用EntityFramework提供给的模型创建工具创建数据模型与映射元数据,通过这些元数据信息创建数据库
  3. Code First:通过DDD创建领域对象并配置映射规则,数据迁移规则。EF会根据领域对象模型与映射规则来创建数据库

下面我们依次来看看3种模式在实际的编码过程中怎么使用,示例程序使用SQL Server2016数据库引擎,Northwind数据库。开发工具为VS2017。

1 Database First数据模型定义

1,创建控制台应用Demo.DatabaseFirst

2,安装EntityFramework Nuget包,示例程序版本为6.2.0

3,添加实体数据模型,在Data模板下选择ADO.NET实体数据模型,命名为DemoModel

4,因为我们是从数据库生成实体数据模型,所以,我们选择来自数据库的EF设计器

5,进行数据库配置,由于我这里之前配置过数据库,所以会有之前的连接信息,此处,我们新建数据库连接,点击新建连接

6,配置数据连接,并选择数据库。在高级选项中,有关于连接配置的选项,可以根据需要修改。

7,配置完成后,点击下一步选择需要生成实体数据模型的表(视图,存储过程或者函数)

8,点击完成,此时,从数据库映射的实体数据模型已经生成。我们可以看一下,在解决方案结构中,EF帮我们新建了哪些文件,在配置文件中又帮我们加入了哪些内容

DemoModel.edmx就是EF帮我们生成的数据模型,双击之后,我们可以看到我们选中的表已经映射成为了实体数据模型。生成模型的规则是EF定义的模板文件(XXX.tt),不同的EF版本有不同的模板文件,我们也可以自定义模板文件。我们右键点击某个模型,可以看到如下图的菜单。从数据库更新模型,当数据库发生更改的时候,我们可以通过点击此菜单来将数据库的更改映射到模型。表映射可以查看实体数据类型与表的映射,属性与列信息的映射信息等等。我们也可以查看数据模型的属性,在空白处点击右键,选择属性。可以看到数据模型的选项,有数据库的连接字符串信息,是否延迟加载等等,可以根据需求自行更改配置。

实体关系:从edmx设计中可以看到,实体之间的连接线有1…*,*…*,0..1的关联属性,这些关系实际上映射的就是数据库中表之间的关系,也就是我们常说的,一对一,多对多,一对多。实体数据模型会根据数据库中的主外键信息自动生成关系模型数据。选中连接线,右键查看属性,可以查看实体之间关系的具体信息。

导航属性:上面说了,实体与实体之间是存在关系的,那么怎么从一个实体去访问另外一个与他有关系的实体呢,实际上我们通过导航属性。导航属性实际上就是实现了从一个实体到另一个关联实体的访问机制。

实体数据模型实际上包含了实体对象信息,数据库元数据信息,对象与数据库的映射信息。那么这些信息是在哪里定义的呢,我们使用文本编辑工具打开DemoModel.edmx文件,可以看到edmx实际上是一个xml文件,这个xml文件的主要节点如下

1,edmx:StorageModels(逻辑层SSDL):SSDL主要定义了数据库中表,列,关系,视图,函数等

2,emdx:ConceptualModels(概念层CSDL):CSDL主要定义了数据模型的实体类型,这些实体暴露给上层来操作实体数据

3,edmx:Mappings(映射层):SSDL与CSDL之间的关系映射

2 Database First数据模型操作

EntityFramework使用了上述的xml文件定义了,实体,数据库对象,与他们之间的关系。至此,我们完成了EntityFramework的实体数据映射并分析了基本原理。定义数据模型的意义在于操作数据,下面我们使用数据模型来进行数据的增删改查。我们新建类CategoryServices,并添加AddCategory,UpdateCategory,DeleteCatetory,GetCatetories四个方法

2.1增加数据

public bool AddCategory(Category category)
{
using (NorthwindEntities context = new NorthwindEntities())
{
context.Categories.Add(category); return context.SaveChanges()>;
}
}

2.2修改数据

public bool UpdateCategory(Category category)
{
bool reuslt = false;
using (NorthwindEntities context = new NorthwindEntities())
{
Category currentCategory = context.Categories
.FirstOrDefault(parm => parm.CategoryID == category.CategoryID);
if (currentCategory != null)
{
currentCategory.Description = category.Description;
reuslt = context.SaveChanges() > ;
} return reuslt;
}
}

2.3删除数据

public bool DeleteCatetory(int id)
{
bool reuslt = false;
using (NorthwindEntities context = new NorthwindEntities())
{
Category currentCategory = context.Categories
.FirstOrDefault(parm => parm.CategoryID == id);
if (currentCategory != null)
{
context.Categories.Remove(currentCategory);
reuslt = context.SaveChanges() > ;
} return reuslt;
}
}

2.4查询数据

public List<Category> GetCatetories()
{
using (NorthwindEntities context = new NorthwindEntities())
{
return context.Categories.ToList();
}
}

调用代码

class Program
{
static void Main(string[] args)
{
CategoryServices services = new CategoryServices(); List<Category> categories = services.GetCatetories();
categories.ForEach(parm => Console.WriteLine($"{parm.CategoryName}---{parm.Description}"));
Console.WriteLine("---select---"); Category category = new Category
{
CategoryName = "Microsoft",
Description = "this is Microsoft"
}; bool result = services.AddCategory(category);
Category categoryAdd = services.GetCatetories().LastOrDefault();
Console.WriteLine($"{categoryAdd.CategoryName}---{categoryAdd.Description}");
Console.WriteLine("---add---"); Category categoryUpdate = new Category
{
CategoryID = categoryAdd.CategoryID,
CategoryName = "Microsoft",
Description = "this is Microsoft update"
}; bool updateResult = services.UpdateCategory(categoryUpdate);
Console.WriteLine($"{categoryUpdate.CategoryName}---{categoryUpdate.Description}");
Console.WriteLine("---update---"); int catetoryId = categoryAdd.CategoryID;
bool deleteUpdate = services.DeleteCatetory(catetoryId);
Category categoryLast = services.GetCatetories().LastOrDefault();
Console.WriteLine($"{categoryLast.CategoryName}---{categoryLast.Description}");
Console.WriteLine("---delete---"); Console.ReadLine();
}
}

执行结果

如下图执行结果,第一步我们打印了所有的Category,第二步我们添加一条Category,紧接着我们修改了添加的这条数据,最后我们删除这条数据。可以看到,增删改查操作完成。是不是感觉操作数据库也可以像操作对象一样简单,便捷。

数据操作基本概念

DbContext:上面的实例中,我们实例化了类型NorthwindEntities。这个在我们配置数据库连接的时候输入的上下文名称。实际上,在EntityFramework帮助我们生成数据模型时,也同时帮我们生成了继承与DbContext类型的数据上下文,我们这里是NorthwindEntities。那么数据上下文是什么呢。数据上下文实际是真实与数据库交互的桥梁。前面的章节我们定义了对象,数据,映射,这些都是基础设施,也是基础结构。在操作数据时,比如添加数据。最终数据库能执行的操作只会是SQL语句,存储过程等。所以 ,数据上下文监测了我们对实体类型的更改,在调用SaveChange时将我们对上下文中实体的更改转换成SQL语句发送给数据库执行,我们可以打开SQL Server监视工具来查看EntityFrameworkSaveChange后生成的SQL语句。所以,在了解了ORM的核心概念后,其实,如果我们愿意,也可以自己实现一套ORM工具。

下面的代码就是EntityFramework生成的继承自DbContext的数据上下文。

namespace Demo.DatabaseFirst
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure; public partial class NorthwindEntities : DbContext
{
public NorthwindEntities()
: base("name=NorthwindEntities")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
} public virtual DbSet<Category> Categories { get; set; }
public virtual DbSet<CustomerDemographic> CustomerDemographics { get; set; }
public virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Employee> Employees { get; set; }
public virtual DbSet<Order_Detail> Order_Details { get; set; }
public virtual DbSet<Order> Orders { get; set; }
public virtual DbSet<Product> Products { get; set; }
public virtual DbSet<Region> Regions { get; set; }
public virtual DbSet<Shipper> Shippers { get; set; }
public virtual DbSet<Supplier> Suppliers { get; set; }
public virtual DbSet<Territory> Territories { get; set; }
}
}

好了,至此,EntityFramework的基本概念和Database First基本操作已经完成,由于水平有限,如果在讲解过程中有任何错误请留言告知,在学习与记录的过程与大家共同进步。下一篇会讲解EntityFramework的Model First。

EntityFramework(1)基础概念与Database First的更多相关文章

  1. 【Service】【Database】【MySQL】基础概念

    1. 数据模型:层次模型.网状模型.关系模型 关系模型: 二维关系: 表:row, column 索引:index 视图:view 2. SQL接口:Structured Query Language ...

  2. zabbix监控的基础概念、工作原理及架构(一)

    zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  3. 关系型数据库基础概念:MySQL系列之开篇

    一.基础概念 数据(Data)是描述事物的符号记录,是指利用物理符号记录下来的.可以鉴别的信息. 1.数据库(Database,DB)是指长期储存在计算机中的有组织的.可共享的数据集合.数据要按照一定 ...

  4. 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲

    目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...

  5. JDBC_01_JDBC基础概念

    JDBC 基础概念 JDBC 的本质 JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Ja ...

  6. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  8. Jmeter基础之---jmeter基础概念

    Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...

  9. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

随机推荐

  1. 针对zstack虚拟机导出的问题的解决办法!

    1. nfs 首先定位image所在位置: 云主机--〉云盘操作--〉配置信息--〉更多信息--安装路径 /opt/zstack/nfsprimarystorage/prim-aab63dc6284f ...

  2. HDU 2147 P/N博弈

    点这里去做题 如图 找必胜点和必败点, 1.终点为必胜点 2.所有能一步走到必胜点的都是必败点 3.每一步都只能走到必败点的是必胜点 #include<bits/stdc++.h> usi ...

  3. visual studio 2015 Opencv 3.4.0配置

    因为想做AR方面,需要了解计算机视觉知识,决定从opencv开始入门,在网上买了本毛星云的<Opencv3编程入门>开始自学. 一.opencv 3.4.0下载安装 在官网http://o ...

  4. CDN随笔

    CDN的理解:(1)CDN (内容分发网络)加速用户获取数据的 系统(2)部署在离用户最近的网络节点上(3)命中CDN 不需要访问后端服务器(4)互联网公司自己搭建或租用

  5. vue.js 系列教程

    Vuejs——(1)入门(单向绑定.双向绑定.列表渲染.响应函数) Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器 Vuejs——(3)计算属性,样式和类绑定 Vuejs——(4)v ...

  6. Android-MySQLiteOpenHelper的理解

    MySQLiteOpenHelper: package com.esandinfo; import android.content.Context; import android.database.s ...

  7. 基于HTTP的长轮询简单实现

    Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为短连接与长轮询. 短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接. 在长轮询机制中,客户端像传统轮 ...

  8. Javascript高级编程学习笔记(66)—— 事件(10)变动事件

    变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...

  9. Android加密解析

    编码.数字摘要.加密.解密 UrlEncoder /Urldecoder String str = "http://www.baidu.com?serach = 哈哈"; Stri ...

  10. FTP服务器搭建

    FTP 服务器架设: 关闭防火墙 service iptables stop 关闭SELinux setenforce 0 安装所需依赖及编译工具 yum install -y gcc openssl ...