曾经我以为再也不会去弄啥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的更多相关文章

  1. 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    将 ...

  2. [转帖]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 ...

  3. Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...

  4. 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 ...

  5. [转]ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction

    本文转自:http://blog.csdn.net/alvachien/article/details/51576961 跟Entity Framework之前的版本不同,Class DbContex ...

  6. ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction

    跟Entity Framework之前的版本不同,Class DbContext不再有AcceptAllChanges()方法. 使用Transaction需要使用DbContext中的Databas ...

  7. 请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?

    using dotNET.Core; using Microsoft.Extensions.Logging; using System; using System.Collections.Generi ...

  8. Entity Framework Core 练习参考

    项目地址:https://gitee.com/dhclly/IceDog.EFCore 项目介绍 对 Microsoft EntityFramework Core 框架的练习测试 参考文档教程 官方文 ...

  9. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  10. .NET CORE学习笔记系列(2)——依赖注入[8]: .NET Core DI框架[服务消费]

    原文:https://www.cnblogs.com/artech/p/net-core-di-08.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的I ...

随机推荐

  1. 了不起的 Deno:带你极速获取各大平台今日热榜

    摘要:Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验. 有人的地方就有江湖,有江湖的地方就有争论.前些天,继<[译]为什么如 ...

  2. charles功能(五)屏蔽web网页的抓包信息(proxy)

    应用场景:屏蔽web网页的抓包信息 proxy-->windows proxy(前面没有对勾,就不会抓到 PC浏览器的包) proxy-->macOS proxy(mac电脑) 最终效果

  3. 修改MongDB的数据类型

    语法: db.集合.find({"列":{$type:2}}).forEach(function(x){ x.列=parseFloat(x.列);db.order.save(x) ...

  4. 第3章 Python的数据类型 第3.1节 功能强大的 Python序列概述

    一.概述 序列是Python中最基本的数据结构,C语言中没有这样的数据类型,只有数组有点类似,但序列跟数组差异比较大. 序列的典型特征如下: 序列使用索引来获取元素,这种索引方式适用于所有序列: 序列 ...

  5. Python中super()或object.__new__报TypeError: object.__new__() takes no arguments错误的解决方案

    出现这种情况是调用object类__new__方法参数传递多了导致: 一般是使用了类似super().new(cls,*args,**kwargs) 或object.new(self,*args,** ...

  6. PyQt(Python+Qt)学习随笔:QScrollBar以及QAbstractSlider滚动条部件功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在Designer输入部件中Horizo ...

  7. PyQt(Python+Qt)学习随笔:布局控件layoutSpacing属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

  8. jdk源码之 hashmap 与hashtable 的区别

      hashmap hashtable 线程安全 否,但jdk5之后,提供ConcurrentHashMap,可 替代HashTable. 是,synchronized value是否允许为空 是 否 ...

  9. web文件包含

    web安全~文件包含总结   文章来自freebuf,作者总结的很好,所以拿来做笔记用!!! 0×01 文件包含简介 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当P ...

  10. MacOS上Parallels Desktop安装MacOSHighSierra

    下载dmg文件 http://www.macoshome.com/macos/977.html 配置宿主机时间2015-10-27 23:25 为了防止"macOS未能安装在您的电脑上_安装 ...