.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(); 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(); 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(); 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();
});
}
}
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 的。至少性能摆在那里!
下面引用官方的图片,展示它们在功能上的比较:





.net core Entity Framework 与 EF Core的更多相关文章
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
- ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- NET Core & Entity Framework Core
ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5) 本文是ABP官方文档翻译版,翻译基于 ...
- ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介
.NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF
Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...
- 【.Net Core 学习系列】-- EF Core 实践(Code First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project --> ...
- 【.Net Core 学习系列】-- EF Core实践(DB First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...
随机推荐
- 体育Bank2016会议笔记
补注:会议全称应该是体育Bank2016体育投融资总裁年会 新华社体育部徐仁基 演讲主题:帮郭川找到大海-->帮民众找到自己真正的体育爱好 激发和培养体育市场是重中之重 将体育培养成生活习惯.生 ...
- JAVA中Sql时间格式与util时间格式转换
关于时间格式转化: java.util.Date 与 java.sql.Date 互换 sql是子类 字符串转化成java.util.Date SimpleDateFormat date =n ...
- NewLife.Net——网络压测单机1.88亿tps
NewLife.Net压力测试,峰值4.2Gbps,50万pps,消息大小24字节,消息处理速度1.88亿tps! 共集合20台高配ECS参与测试,主服务器带宽6Gbps.100万pps,16核心64 ...
- C#读取shp文件并获取图形保存到sde要素类中(不使用ESRI的类库,纯c#实现)
说明:首先要将sde要素类发布成对应的要素服务,通过对要素服务的操作,实现数据在sde要素类中的增删 //向服务器发出请求 public string getPostData(string postS ...
- numpy用法归纳
1.生成数组 import numpy as np 把python列表转换为数组 >>> np.array([1, 2, 3]) array([1, 2, 3]) 把python的r ...
- Flask信号和wtforms
一.信号 1.1.所有内置信号 request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _s ...
- 定制炫彩界面:duilib与MFC 的对比
duilib是以DirectUI为技术原理开发的一款轻量级Windows桌面UI库,使用XML来描述界面风格,界面布局,可以很方便的构建高效,绚丽的,非常易于扩展的界面.从而很好的将界面和逻辑分离,同 ...
- .NET开发微信小程序-接收微信支付回调数据
获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...
- arcEngine开发之IMap、ILayer、IFeatureLayer和IFeatureClass关系
刚开时学习 Engine 开发时,对于这几个接口之间的关系总是理不清,因此写下这篇文章做个总结. 是什么 在 engine 开发中,我觉得使用过程中应该将每个接口对应到 ArcMap 中的具体事物中, ...
- https://doc.opensuse.org/projects/kiwi/doc/
KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...