.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 ...
随机推荐
- 通过sql 语句将多行数据拼接到一行中
- spring框架使用c3po链接数据库
编辑工具:idea 1.配置pom.xml文件(创建模板时软件自动创建) 导入spring的核心架包 全部架包官网:https://mvnrepository.com/ 1 <dependenc ...
- iNeuOS工业互联平台,WEB组态(iNeuView)图元和数据点组合及生成新图元复用,实现拖业务
目 录 1. 概述... 1 2. 平台演示... 2 3. 应用过程... 2 1. 概述 iNeuView视图建模Web组态平台实现图元和数据点组合及 ...
- 第11.11节 Python正则表达式的指定重复次数匹配模式及元字符”{}”功能介绍
在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "". "+"功能介绍>和<第11.10节 Pyth ...
- Redis数据库简介
最近的项目需要用到Redis数据库和MySQL,恶补学习. Redis的使用手册可以看: https://redis.io/ https://www.runoob.com/redis/redis-tu ...
- metasploit魔鬼训练营靶机环境搭建(第二章)
环境搭建,书上已经很详细了,路由转发的那个鼓捣了好久都没弄好,菜的啊 所以先往书后面继续学习,不停留在配置环境上了. backtrack没有下载,使用的kali linux 其他的都是一样的 百度网盘 ...
- jq中$(function(){})和js中window.onload区别
先看下执行代码: $(function(){ console.log("jq");}) $(function(){ console.log("jq1") ...
- CSS绘制正五角星原理(数学模型)
尽管网上有很多CSS绘制五角星的代码案例,但是对于初学者来说可以拿来移植使用,但是在不明白其原理的情况下,进行修改移植就比较困难了.譬如想要将五角星尺寸进行缩小或者放大等设计,就需要对原代码相关数据进 ...
- selenium 淘宝商品分页
通过这行代码确定每页的下一页,因为从淘宝的第4页 xpath就匹配不出下一页的位置#这是面向对象写法,不用的把self. 去掉即可next_button = self.driver.find_elem ...
- 【APIO2019】路灯(ODT & (树套树 | CDQ分治))
Description 一条 \(n\) 条边,\(n+1\) 个点的链,边有黑有白.若结点 \(a\) 可以到达 \(b\),需要满足 \(a\to b\) 的路径上的边不能有黑的.现给出 \(0\ ...