.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 作为名称,然后单击确定;

    • 这将启动实体数据模型向导;

    • 选择从数据库生成单击下一步;

640?wx_fmt=png

    • 选择连接到第一个部分中创建的数据库中,直接用生成的 LibraryEntities 作为名称的连接字符串和单击下一步;

640?wx_fmt=png

    • 选择好实体框架 6.x ,下一步;

640?wx_fmt=png


    • 再单击表导入的所有表并单击完成旁边的复选框,点击完成。

640?wx_fmt=png

    • 反向工程过程完成后,新的模型就添加到了项目,并直接打开了实体框架设计器

 640?wx_fmt=png

            那么现在已经创建完了实体模型。在创建的过程当中,已经帮我们建好了数据类型,生成了表的映射还有存储过程的映射,这贼爽了,点几下就搞定了,接着就可以进行增删改查了(具体怎么做,这里就不详解了)。

            EF设计器中,我们同样可以操作表,更新表的字段,再通过正向工程,可以更新数据库中的表。

            PS:使用 Code First 生成的实体,比EF设计器生成的要干净,但是也失去了正向工程的功能。

(二)Entity Framework Core

           它是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。可用作对象关系映射程序 (ORM),以便于 .NET 开发人员能够使用 .NET 对象来处理数据库,这样就不必经常编写大部分数据访问代码了。


           EF Core 则完全进行了重写,包含许多 EF6 没有的新功能,但还是缺少 EF6 中最高级的一些映射功能。

           那如果要通过 VS 进行反向工程的话,需要安装 PMC 工具,而且这个工具是仅限于VS使用的。当然也还有一些非常棒的代码生成工具,比如 Code Smith。

           使用PMC生成实体过程:

    • 打开VS的程序包管理控制台

640?wx_fmt=png

    • 在程序包管理器控制台(PMC)工具中使用命令 Scaffold-DbContext 来进行反向工程。

640?wx_fmt=png

           当出入命名直接回车后,会在项目的根目录下生成文件。当然,你也可以在 Scaffold-DbContext 命令中加入指定的生成路径等设置命令的。

640?wx_fmt=png

            这个跟用EF中用 Code First 生成文件是一个毛样的结果。下图就是 Code First 生成的。

640?wx_fmt=png

            当然,他们生成的代码还是有区别的。我们来看看 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 的。至少性能摆在那里!

            下面引用官方的图片,展示它们在功能上的比较:

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

原文地址:https://www.cnblogs.com/Vam8023/p/10778511.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1253F Cheap Robot

CF1253F Cheap Robot 题意&#xff1a; 给你一张 N 个点的带权无向连通图&#xff0c;其中结点 1,2,…,k 为充电中心。 一个机器人在图中行走&#xff0c;假设机器人的电池容量为 c&#xff0c;则任何时刻&#xff0c;机器人的电量 x 都必须满足 c0≤x≤c。如果机器人沿着一…

asp.net core 3.0 gRPC框架小试

什么是gRPCgRPC是google开源的一个高性能、跨语言的RPC框架&#xff0c;基于HTTP2协议&#xff0c;采用ProtoBuf 定义的IDL。gRPC 的主要优点是&#xff1a;现代高性能轻量级 RPC 框架。协定优先 API 开发&#xff0c;默认使用协议缓冲区&#xff0c;允许与语言无关的实现。可用…

P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步 题意&#xff1a; 有一颗树&#xff0c;有一个点是激发器&#xff0c;从这个点开始可以产生一个激励电流&#xff0c;通过导线传向每一个它所连接的节点&#xff0c;经过一个边的花费为w[i],你有一个道具&#xff0c;每用一次可以让一个边的花费1&…

.Net开发者必知的技术类RSS订阅指南

作为一个.Net开发者&#xff0c;在如今这个信息大爆炸时代&#xff0c;网络上.net开发方面的信息浩如烟海(获取信息的渠道很多&#xff0c;比如各种 APP、公众号、聚合信息网站、博客园、InfoQ等等)&#xff0c;如何用有限的时间来获取并消化有效信息显得格外重要。虽然我们获取…

又一最大子段和

又一最大子段和&#xff08;牛客小白月赛38 &#xff09; 题意&#xff1a; 我们将一个数列{an}的最大字段和的值记为S(a),现在你可以对进行若干次操作&#xff0c;每次操作&#xff0c;你可以选择数列中的一个数字&#xff0c;将其改为[−10100,10100][-10^{100},10^{100}][…

我的微服务观,surging 2.0将会带来多大的改变

Surging 自2017年6月16日开源以来&#xff0c;已收到不少公司的关注或者使用&#xff0c;其中既有以海克斯康超大型等外企的关注&#xff0c;也不乏深圳泓达康、重庆金翅膀等传统行业的正式使用&#xff0c;自2019年年初&#xff0c;surging2.0 便已正式进入研发阶段&#xff0…

corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的

在昨天的技术周会上发现 EnyimMemcached 中建立 Socket 连接的代码有问题&#xff0c;今天坐车的时候在手机上阅读 .net core 2.2 的 SqlClient 中同步建立 Socket 连接的代码 SNITcpHandle.cs#L180 学习了一下。建立 Socket 连接需要处理2个问题&#xff1a;1&#xff09;处理…

NetCore + SignalR 实现日志消息推送

哈喽大家周一好呀&#xff0c;感觉好久没有写文章了&#xff0c;上周出差了一次&#xff0c;感觉还是比坐办公室好的多&#xff0c;平时在读一本书《时生》&#xff0c;感兴趣的可以看看?......这几天翻看 NetCore 相关知识扩展的时候&#xff0c;发现了久违的一个知识点 ——…

使用Entity Framework Core访问数据库(DB2篇)

上一篇讲了一些EF Core访问Oracle的坑。&#xff08;感兴趣请移步&#xff1a;使用Entity Framework Core访问数据库&#xff08;Oracle篇&#xff09;&#xff09;这篇主要讲一下关于EF Core访问DB2的一揽子~问题。本篇采用DBFirst直接生成实体。关于EF Core DB2 的官方文档&a…

Linux中以单容器部署Nginx+ASP.NET Core

正如前文提到的&#xff0c;强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器&#xff0c;本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。Nginx->ASP.NET Coe部署架构容器化在Docker中部署Nginx--->ASP.NETCore 有两种选择&#x…

领域驱动设计学习之路—DDD的原则与实践

本文是我学习Scott Millett & Nick Tune编著的《领域驱动设计模式、原理与实践》一书的学习笔记&#xff0c;一共会分为4个部分如下&#xff0c;此文为第1部分&#xff1a;领域驱动设计的原则与实践战略模式&#xff1a;在有界上下文之间通信战术模式&#xff1a;创建有效的…

.NET Core中使用Dapper操作Oracle存储过程最佳实践

为什么说是最佳实践呢&#xff1f;因为在实际开发中踩坑了&#xff0c;而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为OracleDbType.RefCursor&#xff0c;输出为&#xff1a;ParameterDirection.Output数据的时候。网上千篇一律的说写一个Ora…

CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB

一、多样输出支持CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件&#xff0c;它可以随着ASP.NET Core实例的启动而启动&#xff0c;目前采用轮询的方式对Canal Server进行监听&#xff0c;获得MySql行更改&#xff08;RowChange&#xff09…

CF1039C Network Safety

CF1039C Network Safety 题意&#xff1a; 题解&#xff1a; 如果我们同时选中a&#xff0c;b两个点&#xff0c;无论异或什么值&#xff0c;都不会影响图的安全性&#xff0c;因为图本来就是安全的 破坏图的安全性只有一种情况&#xff0c;那就是选了a&#xff0c;没选b&…

使用Jenkins来实现内部的持续集成流程(下)

目录配置项目构建添加任务添加源代码地址和登录凭据添加构建触发器 TFS添加WebHook 添加构建步骤后端UI API端 配置项目构建1添加任务2添加源代码地址和登录凭据添加源代码地址和登录凭证此图没有填写凭证时显示的错误点击Credential后面的添加 填写能访问源代码的用户名和密码…

.NET和Docker ,比翼双飞

DockerCon 2019本周将在旧金山举行 &#xff0c;DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团队博客发布了《一起使用.NET和Docker - DockerCon 2019更新》&#xff1a;https://devblogs.microsoft.com/dotnet/using-net-…

Visible Lattice Points SPOJ - VLATTICE

Visible Lattice Points SPOJ - VLATTICE 题意&#xff1a; 有一个n∗n∗n的三维直角坐标空间&#xff0c;问从(0,0,0)看能看到几个点。 题解&#xff1a; 本题是二维的一个升级版&#xff0c;升级成三维 用莫比乌斯反演来做 代码&#xff1a; #include <bits/stdc.h…

使用ASP.NET Core开发GraphQL服务器 -- 极简预备知识(上)

为了介绍使用ASP.NET Core构建GraphQL服务器&#xff0c;本文需要介绍一下GraphQL&#xff0c;其实看官网的文档就行。什么是GraphQL&#xff1f;GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描…

使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试

如果你是开发个人项目&#xff0c;那就直接用 Visual Studio Community 版本吧&#xff0c;对个人免费&#xff0c;对小团体免费&#xff0c;不需要这么折腾。如果你是 Mac / Linux 用户&#xff0c;不想用 Visual Studio for Mac 版&#xff1b;或者不想用 Visual Studio for …

亲儿子 | Azure SignalR 服务现在支持 ASP.NET

点击上方蓝字关注“汪宇杰博客”文 / Zhidi译 / Edi Wang我们刚刚发布了支持ASP.NET的正式版 SignalR 服务 SDKMicrosoft.Azure.SignalR.AspNet v1.0.0Azure SignalR 服务是一种完全托管的用于实时消息传递的 Azure 服务。它是扩展 ASP.NET Core SignalR 应用程序的首选方法。但…