.net core Entity Framework 与 EF Core
重点讲 Entity Framework Core !
(一)Entity Framework
它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致认可的数据访问技术(原来加 Title 也挺有意思的,哈哈哈)。
作为 ORM,EF6 降低了关系方面和面向对象的方面之间的阻抗不匹配,使开发人员能够使用表示应用程序域的强类型 .NET 对象来编写应用程序,该应用程序可与存储在关系数据库中的数据交互,同时使开发人员无需再编写大部分的数据访问“管道”代码。这是微软官方吹牛逼的原话,但也很好理解。
那基于 EF6 可以实现很多 ORM 的热门的一些功能:
- 不依赖于任何 EF 类型的 POCO (Plain Old CLR Object) 实体类的映射
- 自动更改跟踪
- 标识解析和工作单元
- 预先、延迟和显式加载
- 使用 LINQ(语言集成查询)转换强类型查询
- 丰富的映射功能,可支持:
- 一对一、一对多和多对多关系
- 继承(每个层次结构一张表、每个类型一张表和每个具体类一张表)
- 复杂类型
- 存储过程
- 通过可视化设计器创建实体模型。
- 通过编写代码创建实体模型的“Code First”体验。
- 既可从现有数据库生成模型,然后手动编辑,也可从头开始创建模型,然后用于生成新的数据库。
- 与 .NET Framework 应用程序模型(包括 ASP.NET)集成,并通过数据绑定与 WPF 和 WinForms 集成。
- 基于 ADO.NET 的数据库连接和可用于连接到 SQL Server、Oracle、MySQL、SQLite、PostgreSQL、DB2 等的众多提供程序。
相信很多人都使用过 VS 中 EF 设计器,我以前用得比较多,主要就是在项目中创建的:
项目->添加新项...
选择数据左侧的菜单,然后ADO.NET 实体数据模型;
用生成的 Model 作为名称,然后单击确定;
这将启动实体数据模型向导;
选择从数据库生成单击下一步;
- 选择连接到第一个部分中创建的数据库中,直接用生成的 LibraryEntities 作为名称的连接字符串和单击下一步;
- 选择好实体框架 6.x ,下一步;
再单击表导入的所有表并单击完成旁边的复选框,点击完成。
反向工程过程完成后,新的模型就添加到了项目,并直接打开了实体框架设计器
那么现在已经创建完了实体模型。在创建的过程当中,已经帮我们建好了数据类型,生成了表的映射还有存储过程的映射,这贼爽了,点几下就搞定了,接着就可以进行增删改查了(具体怎么做,这里就不详解了)。
EF设计器中,我们同样可以操作表,更新表的字段,再通过正向工程,可以更新数据库中的表。
PS:使用 Code First 生成的实体,比EF设计器生成的要干净,但是也失去了正向工程的功能。
(二)Entity Framework Core
它是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。可用作对象关系映射程序 (ORM),以便于 .NET 开发人员能够使用 .NET 对象来处理数据库,这样就不必经常编写大部分数据访问代码了。
EF Core 则完全进行了重写,包含许多 EF6 没有的新功能,但还是缺少 EF6 中最高级的一些映射功能。
那如果要通过 VS 进行反向工程的话,需要安装 PMC 工具,而且这个工具是仅限于VS使用的。当然也还有一些非常棒的代码生成工具,比如 Code Smith。
使用PMC生成实体过程:
打开VS的程序包管理控制台
在程序包管理器控制台(PMC)工具中使用命令 Scaffold-DbContext 来进行反向工程。
Scaffold - DbContext 'Data Source=.;Initial Catalog=Library;integrated security=true' Microsoft.EntityFrameworkCore.SqlServer
当出入命名直接回车后,会在项目的根目录下生成文件。当然,你也可以在 Scaffold-DbContext 命令中加入指定的生成路径等设置命令的。
这个跟用EF中用 Code First 生成文件是一个毛样的结果。下图就是 Code First 生成的。
当然,他们生成的代码还是有区别的。我们来看看 Scaffold-DbContext 命令生成的三个文件的代码:
1、LibraryContext.cs
public partial class LibraryContext : DbContext{public LibraryContext(){}public LibraryContext(DbContextOptions<LibraryContext> options): base(options){}public virtual DbSet<Books> Books { get; set; }public virtual DbSet<Categories> Categories { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=Library;integrated security=true");}}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.HasAnnotation("ProductVersion", "2.2.3-servicing-35854");modelBuilder.Entity<Books>(entity =>{entity.ToTable("books");entity.Property(e => e.Id).HasColumnName("id").ValueGeneratedNever();entity.Property(e => e.Author).IsRequired().HasColumnName("author").HasMaxLength(50);entity.Property(e => e.Cateid).HasColumnName("cateid");entity.Property(e => e.Createtime).HasColumnName("createtime").HasColumnType("datetime");entity.Property(e => e.Isdel).HasColumnName("isdel");entity.Property(e => e.Name).IsRequired().HasColumnName("name").HasMaxLength(50);entity.HasOne(d => d.Cate).WithMany(p => p.Books).HasForeignKey(d => d.Cateid).OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_books_categories");});modelBuilder.Entity<Categories>(entity =>{entity.ToTable("categories");entity.Property(e => e.Id).HasColumnName("id").ValueGeneratedNever();entity.Property(e => e.Cascadeid).IsRequired().HasColumnName("cascadeid").HasMaxLength(20);entity.Property(e => e.Createtime).HasColumnName("createtime").HasColumnType("datetime");entity.Property(e => e.Fid).HasColumnName("fid");entity.Property(e => e.Isdel).HasColumnName("isdel");entity.Property(e => e.Name).IsRequired().HasColumnName("name").HasMaxLength(50);});}}
2、Categories.cs
public partial class Categories{public Categories(){Books = new HashSet<Books>();}public int Id { get; set; }public int Fid { get; set; }public string Name { get; set; }public string Cascadeid { get; set; }public DateTime Createtime { get; set; }public bool Isdel { get; set; }public virtual ICollection<Books> Books { get; set; }}
3、Books.cs
public partial class Books{public int Id { get; set; }public int Cateid { get; set; }public string Name { get; set; }public string Author { get; set; }public DateTime Createtime { get; set; }public bool Isdel { get; set; }public virtual Categories Cate { get; set; }}
通过上面可以看到,它们已经生成好了映射。但是,如果要映射存储过程的话,EF Core 是不支持的。
(三)它们的区别
EF Core 提供了在 EF6 中不会实现的新功能(如备选键、批量更新以及 LINQ 查询中的混合客户端/数据库评估。 但由于它是一个新代码库,所以会缺少一些 EF6 中的功能。这也是正常的,但是它还在不断的完善!
EF Core 是更现代、可扩展的轻量级实体框架版本,与 EF6 的功能和优点非常相似。如果功能与需求都匹配的话,可以优先考虑使用 EF Core 的。至少性能摆在那里!
下面引用官方的图片,展示它们在功能上的比较:
转载于:https://www.cnblogs.com/Vam8023/p/10778511.html
.net core Entity Framework 与 EF Core相关推荐
- EF(Entity Framework、EF Core)
学习EF的前提: 熟悉Linq和ADO.Net, 熟悉委托和Lamdba 在使用EF框架进行开发时,我们大多情况使用Linq进行数据查询和操作,而EF底层实现是用ADO.Net进行封装的 EF框架其实 ...
- 手把手引进门之 ASP.NET Core Entity Framework Core(官方教程翻译版 版本3.2.5)
以下是手把手引进门教程,基于 ASP.NET Core, Entity Framework Core ,ABP 框架 创建Web 应用, PS: 自带自动的测试模块哦. 样例下载 (上 github ...
- abp mysql .net core_ABP .Net Core Entity Framework迁移使用MySql数据库
一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 ht ...
- ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
ASP.NET Core 入门教程 8.ASP.NET Core + Entity Framework Core 数据访问入门 原文:ASP.NET Core 入门教程 8.ASP.NET Core ...
- 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇
介绍 这是"使用 ASP.NET Core ,Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用"系列文章的第二篇.以下 ...
- 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)
想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...
- ABP .Net Core Entity Framework迁移使用MySql数据库
一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 ht ...
- abp.net mysql_ABP .Net Core Entity Framework迁移使用MySql数据库
一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 ht ...
- 在.NET Core类库中使用EF Core迁移数据库到SQL Server
前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...
最新文章
- php 打开动态链接,php调用com组件-dll文件(动态链接库)
- hung-yi lee_p15_机器学习深层网络比浅层网络好在哪
- OSPF有五种报文,hello,dd,lsr,lsu,lsack
- arXiv论文如何一键链接解读视频,这个浏览器扩展帮你实现
- 右键用 pycharm打开
- free和top显示可用内存不一致
- 程序设计入门-C语言基础知识-翁恺-第六周:数组-详细笔记(六)
- python 地址_python 解析地址 | 学步园
- 部署redis主从复制
- 怎么把php网站变灰,CSS效果,让网站全部变成灰色(黑白)
- Linux内核无法放到Ubuntu中,无法通过Linux内核模块(Ubuntu)在内核内存中写入
- python图片转动漫_python实现了照片转化为动漫模式
- java mvp模式_MVP模式入门(结合Rxjava,Retrofit)
- hadoop无法启动DataNode问题
- 抖音短视频抖音搜索seo排名优化技术引流工具源代码开发
- 档案管理制度计算机管理制度,计算机管理档案制度
- c语言多个大写变小写字母,c语言大写字母转换成小写字母
- 乐森 扫地机器人_扫地机器人到底好用不好用?
- java罗马帝国下载,Java程序设计2020满分完整版考 试题库大全
- 阿里数据仓库架构与模型设计
热门文章
- Eclipse反编译插件: Jodeclipse与JadClipse
- C#3.0 为我们带来什么(5) —— 匿名类型
- 工信部发布新能源车准入新规 9月1日起正式实施
- 五种计算机编程语言注定要衰落,牛逼的你怎么看呢???
- mysql有没有批量游标_MySQL使用游标批量处理进行表操作_MySQL
- 操作系统常用调度算法
- 如何创建一张表mysql_如何创建一张规范的MySQL表
- 模板格式丢失_公司法人私章证明丢失应该怎么办,需要补办吗?
- ftp 服务器的目录文件是否存在,ftp服务器的目录文件是否存在
- mysql忘记密麻麻_mysql忘记密码怎么办