EntityFramework(1)基础概念与Database First
基本概念
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中使用模式
- DataBase First:从数据库开始,在数据库已经存在的情况下。通过数据库结构构建实体映射对象,并生成映射元数据
- Model First:使用EntityFramework提供给的模型创建工具创建数据模型与映射元数据,通过这些元数据信息创建数据库
- 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的更多相关文章
- 【Service】【Database】【MySQL】基础概念
1. 数据模型:层次模型.网状模型.关系模型 关系模型: 二维关系: 表:row, column 索引:index 视图:view 2. SQL接口:Structured Query Language ...
- zabbix监控的基础概念、工作原理及架构(一)
zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...
- 关系型数据库基础概念:MySQL系列之开篇
一.基础概念 数据(Data)是描述事物的符号记录,是指利用物理符号记录下来的.可以鉴别的信息. 1.数据库(Database,DB)是指长期储存在计算机中的有组织的.可共享的数据集合.数据要按照一定 ...
- 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲
目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...
- JDBC_01_JDBC基础概念
JDBC 基础概念 JDBC 的本质 JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Ja ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- TCP/IP基础概念及通信过程举例
TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...
- Jmeter基础之---jmeter基础概念
Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...
- 快速入门系列--WCF--01基础概念
转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...
随机推荐
- sublime text3如何在浏览器预览?
插件: view-in-browser CTRL + ALT + V 打开浏览器 默认打开firefox,settings里面可修改. Sublime Text - View In Browser V ...
- Oracle数据库---用户与角色
Oracle数据库---用户与角色 2019年02月26日 10:56:10 俊杰梓 阅读数:21 标签: 数据库 更多 个人分类: 数据库 版权声明:版权所有,转载请注明出处.谢谢 https: ...
- css实现圆形倒计时效果
实现思想: 1.最外层包裹内部的div1(.box) 2.内部左右两边div2(.left_box和.right_box),宽度为div1的一半,通过overflow:hidden隐藏其内部的div ...
- MySQL9:索引实战
索引 无论是面试,还是实际工作中,对于一个Java程序员来说,数据库优化是避不开的一个技术点,关于数据库的优化,在性能达不到要求的情况下,我大致给出以下几个方向: (1)优化表结构,对常用字段和非常用 ...
- 初探系列 — Pharbers用于单点登录的权限架构
一. 前言 就职公司 法伯科技是一家以数据科技为驱动, 专注于医药健康领域的循证咨询公司. 以数据科学家身份, 赋能医药行业. 让每位客户都能享受数据带来的价值, 洞察业务, 不止于数据, 让决策更精 ...
- 每天学点SpringCloud(十):SpringCloud监控
今天我们来学习一下actuator这个组件,它不是SpringCloud之后才有的,而是SpringBoot的一个starter,Spring Boot Actuator.我们使用SpringClou ...
- JavaScript中+操作符的特殊性
在JavaScript中+操作符有两个作用: (1)加法运算 (2)字符串连接 在使用+操作符进行运算时,当+操作符两边都是数值类型的时候,进行加法运算; 当+操作符两边有任意一边是字符串,则进行字符 ...
- docker 简单介绍及基础命令运用
一.什么是docker? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. 简单的来讲Docker实际上就是一个大型容器.容器是完全使用沙箱机制,相互之间不 ...
- shell 中let无法使用的原因
运行 sh let.sh 时,却显示 let: not found 百度之后知道: /bin/sh指向了dash而不是bash,dash不支持let命令. 解决方法: 法1.使用 bash ...
- psnr的定义和python实现
psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限性,一般是用于最大值信号和背景噪音之间的一个工程项目. peak的中文意思是 ...