.NET Core学习笔记(8)——Entity Framework Core之Database First
曾经我以为再也不会去弄啥Database First,然鹅我错了。这个世界上就是有啪啪打脸和真香的时候。当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝。望着他突起的肱二头肌和充满杀意的脸庞,我怎能忍心说,来来来,我们Code First一把……
DB First嘛,首先我们要确保本地有DB才行,本篇我们使用免费的SQL Server LocalDB来举例。LocalDB可以从MSDN下载安装包,也可以直接通过Visual Studio安装。

安装完成后,我们使用Visual Studio来连接LocalDB(当然也可以下载更强大的SQL Sever Management Studio)。首先我们打开Visual Studio的View -> SQL Server Object Explorer。默认应该已经连接到LocalDB了,如果没有可以通过顶层节点右键菜单Add SQL Server来手动操作。

我们通过以下SQL语句在master库创建一张测试用的表。
CREATE TABLE [dbo].[Todoes] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Description] NVARCHAR (MAX) NULL,
[CreatedDate] DATETIME NOT NULL,
[Done] BIT DEFAULT ((0)) NOT NULL,
CONSTRAINT [PK_dbo.Todoes] PRIMARY KEY CLUSTERED ([ID] ASC)
);
至此我们的准备工作算是完成了。接下来我们要通过Entity Framework Core来对Todoes表做Object映射,生成C#的实体类。
首先在Visual Studio 2019中创建空的.NET Core的Console程序作为启动项,再建立一个.NET Standard的Library用以生成Entities Class以及DbContext对象(当然把这两个工程合并为一个也是可以的)。当前工程的结构如下:

接着我们添加Entity Framework Core的references,DataAccess作为数据访问层会使用到EntityFrameworkCore.SqlServer和EntityFrameworkCore.Tools这两个库。当然除了SqlServer,也可以替换成Sqlite等其他Provider。图中并没有升级到最新的5.0.1,这是因为我还在用.NET Core 3.1。如果开发实际项目的话,不妨等到.NET 5.x的LTS版本再全面切换过去。

在我们的Sample中,EfDatabaseFirst作为启动项,需要依赖EntityFrameworkCore.Design库。同时它还需要引用DataAccess工程。

References的添加到此也完成了,现在我们要通过Visual Studio的Package Manage Console窗口来生成实体类。这和.NET 4时代的体验稍有不同,不再有edmx文件了。我想现在大量的通过CLI来替代GUI,也是为了更好的跨平台,让使用Visual Studio Code的Linux小伙伴们有着一致的体验。就是苦了我这样喜欢点点点的懒人……
最后我们要在Package Manage Console中输入Scaffold-DbContext命令。
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=master;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
详细的语法请参考MSDN:Scaffold-DbContext

记得Default project要选DataAccess,否则Models文件夹会跑到EfDatabaseFirst工程里去了。在命令成功运行后,Solution Explorer的结构如下:

如果点开Todoes类,会看到下面的代码,和数据库的表结构做了完美的映射。假使我们的数据库已经设计了100张表,生成实体类也只是一瞬间的事情,如果人肉来做这件事情,996是必不可少的……
namespace DataAccess.Models
{
public partial class Todoes
{
public int Id { get; set; }
public string Description { get; set; }
public DateTime CreatedDate { get; set; }
public bool Done { get; set; }
}
}
本篇我们讨论了如何使用Entity Framework Core的Database First模式来创建实体类。并没有讨论如何使用实体类和DbContext对象。我想把这些留到下一篇Code First。毕竟Code First是更为主流,与Code结合也更为紧密。数据库这种事情,还是DBA比较擅长才对。
SampleCode:
https://github.com/manupstairs/EntityFrameworkCoreSamples
.NET Core学习笔记(8)——Entity Framework Core之Database First的更多相关文章
- ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6 将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0 将 ...
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...
- Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...
- ASP.NET Core 1.0: Using Entity Framework Core
伴随着ASP.NET Core 1.0发布的还有Entity Framework Core 1.0; 官方文档链接:https://docs.efproject.net/en/latest/platf ...
- [转]ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction
本文转自:http://blog.csdn.net/alvachien/article/details/51576961 跟Entity Framework之前的版本不同,Class DbContex ...
- ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction
跟Entity Framework之前的版本不同,Class DbContext不再有AcceptAllChanges()方法. 使用Transaction需要使用DbContext中的Databas ...
- 请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?
using dotNET.Core; using Microsoft.Extensions.Logging; using System; using System.Collections.Generi ...
- Entity Framework Core 练习参考
项目地址:https://gitee.com/dhclly/IceDog.EFCore 项目介绍 对 Microsoft EntityFramework Core 框架的练习测试 参考文档教程 官方文 ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- .NET CORE学习笔记系列(2)——依赖注入[8]: .NET Core DI框架[服务消费]
原文:https://www.cnblogs.com/artech/p/net-core-di-08.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的I ...
随机推荐
- 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题
[Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...
- JavaScript使用中的一些小技巧
任何一门技术在实际中都会有一些属于自己的小技巧.同样的,在使用JavaScript时也有一些自己的小技巧,只不过很多时候有可能容易被大家忽略.而在互联网上,时不时的有很多同行朋友会总结(或收集)一些这 ...
- xargs--冬天里的一丝暖意
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 你有批量kill作业吗?有因为删除文件夹的内容太多而报错吗?-bash: /bin/rm: ...
- 【面试题】在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)
整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起TCP的三次握手 建立TCP连接后发起HTTP请求 服务器响应HTTP请求 浏览器解析h ...
- LeetCode初级算法之数组:217 存在重复元素
存在重复元素 题目地址:https://leetcode-cn.com/problems/contains-duplicate/ 给定一个整数数组,判断是否存在重复元素.如果任意一值在数组中出现至少两 ...
- day105:Mofang:设置页面初始化&更新头像/上传头像&设置页面显示用户基本信息
目录 1.设置页面初始化 2.更新头像 1.点击头像进入更新头像界面 2.更新头像页面初始化 3.更新头像页面CSS样式 4.头像上传来源选择:相册/相机 5.调用api提供的本地接口从相册/相机提取 ...
- HashMap相关类:Hashtable、LinkHashMap、TreeMap
前言 很高兴遇见你~ 在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap ...
- hashmap为什么是二倍扩容?
这个很简单,首先我们考虑一个问题,为什么hashmap的容量为2的幂次方,查看源码即可发现在计算存储位置时,计算式为: (n-1)&hash(key) 容量n为2的幂次方,n-1的二进制会全为 ...
- 我的第一次shell
我的第一次shell 最近我们的项目需要进行优化,整体架构进行改造. 然后我们红超哥就看我骨骼惊奇,说小伙子你想不想当做掌门人呀.(我说不想哈哈) 想不想也没用了,红超哥说我们现在的架构有所改变,需要 ...
- STL——容器(List)list 数据的存取
list.front(); //返回第一个元素 list.back(); //返回最后一个元素 1 #include <iostream> 2 #include <list> ...