asp.net core 系列 21 EF现有数据库进行反向工程
一.概述
在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型。 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序。已有数据库使用上篇的EFGetStarted.AspNetCore.NewDb库。这里还是使用Visual Studio 2017和sql server 2012来演示。
1.1 创建新项目
打开 Visual Studio 2017
“文件”>“新建”>“项目...”
从左菜单中选择“已安装”>“Visual C#”>“Web”。
选择“ASP.NET Core Web 应用程序”项目模板
输入 EFGetStarted.AspNetCore.ExistingDb 作为名称(它必须完全匹配稍后在代码中使用的命名空间),再单击“确定”
等待“新建 ASP.NET Core Web 应用程序”对话框显示出来
确保目标框架下拉列表设置为 .NET Core,版本下拉列表设置为 ASP.NET Core 2.2
选择“Web 应用程序(模型视图控制器)”模板
确保将“身份验证”设置为“无身份验证”
单击“确定”
1.2 安装 Entity Framework Core
安装方法上篇以有介绍。 PM> install-package Microsoft.EntityFrameworkCore.SqlServer -Version 2.2.0
1.3 对模型实施反向工程
基于现有数据库创建 EF 模型,选择“工具”–>“NuGet 包管理器”–>“包管理器控制台”。 运行以下命令(一条命令,排版是二行):
PM> Scaffold-DbContext "Data Source ={ip};Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;"
Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
可以通过将 -Tables 参数添加到上述命令来指定要为哪些表生成实体, 例如 -Tables Blogs,Posts。反向工程过程基于现有数据库的架构创建实体类 (Blogs.cs & Posts.cs) 和派生上下文 (EFGetStartedAspNetCoreNewDbContext.cs),上下文表示与数据库的会话,并允许查询和保存实体类的实例。命令自动生成如下实体类:

1.4 通过依赖关系注入注册上下文
在 Startup.cs 中注册并配置上下文。这里实现与上一篇一样。通过AddDbContext(...) 方法将EF上下文注册为服务。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); /*
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;
*/
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
var connection = "Data Source = {ip}; Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;";
services.AddDbContext<EFGetStartedAspNetCoreNewDbContext>
(options => options.UseSqlServer(connection));
}
1.5 创建控制器和视图
创建BlogsController控制器,在Index方法中读出数据,在视图Blogs/index下显示。
public class BlogsController : Controller
{
public EFGetStartedAspNetCoreNewDbContext NewDbContext { get; }
public BlogsController(EFGetStartedAspNetCoreNewDbContext _NewDbContext)
{
this.NewDbContext = _NewDbContext;
} // GET: /<controller>/
public IActionResult Index()
{
var blogs = NewDbContext.Blogs.ToList();
return View(blogs);
}
}
<!-- index !-->
@model IList<Blogs> @{
foreach (var item in Model)
{
<p>"url:" @item.Url </p>
}
}
在Blogs控制器的index中,通过EF查询出Blogs集合,通过View 重载方法返回一个集合对象 View(blogs), 在Blogs/index页,声明一个IList<Blogs>泛型对象,约定将自动把返回的数据映射到index页面的泛型对象上。如下所示:

参考文献:
官方资料:ASP.NET Core 现有数据库
asp.net core 系列 21 EF现有数据库进行反向工程的更多相关文章
- asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
- asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)
一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json ...
- asp.net core系列 26 EF模型配置(实体关系)
一.概述 EF实体关系定义了两个实体互相关联起来(主体实体和依赖实体的关系,对应数据库中主表和子表关系). 在关系型数据库中,这种表示是通过外键约束来体现.本篇主要讲一对多的关系.先了解下描述关系的术 ...
- asp.net core 系列 20 EF基于数据模型创建数据库
一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...
- asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)
一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...
- asp.net core系列 35 EF保存数据(2) -- EF系列结束
一.事务 (1) 事务接着上篇继续讲完.如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务.下面示例显示了如何在同一事务中执行 ADO.NET SqlCl ...
- asp.net core系列 34 EF保存数据(1)
一. 基本数据 每个EF上下文实例都有一个 ChangeTracker(更改跟踪器),它负责跟踪需要写入数据库的更改. 当更改实体类的实例时(修改属性,删除实例,新建实例等),这些更改会记录在 Cha ...
- asp.net core系列 32 EF查询数据 必备知识(1)
一.查询的工作原理 Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据. 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)基于派生上下文和实 ...
随机推荐
- 蓝桥杯 黄金连分数(BigDecimal的使用)
标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜 ...
- 决AndroidStudio 安卓模拟器安装在D盘问题
决AndroidStudio 安卓模拟器安装在D盘问题 转 http://www.cnblogs.com/LiuDanK/articles/10106473.html 大家知道安卓的模拟器位置默认是放 ...
- 英语知识积累-D01-body+animal
My body What's your name? Here are lots of children playing. Are they happy or sad? Who's waving at ...
- angular1.3 video
video标签动态获取播放链接是出现 Error: $interpolate:interr Interpolation Error Error: $sce:insecurl Processing of ...
- javascript 变量的引入、变量的声明、变量的初始化
变量的引入及声明和初始化: 变量: 操作的数据都是在内存中操作 Js中存储数据使用变量的方式(名称,值--->数据) Js中声明变量都用var--->存储数据,数据应该有对应的数据类型 存 ...
- H5上传功能
近期开发一个关于微信公总号二次开发中,上传图片的需求,测试几个开源插件,更新一些心得,有需要可留言!!! plupload plupload多张上传图片的一个参考demo ajaxFileUpload ...
- 等高布局display:table
display:table用法: 父元素:display:table; 子元素:display:table-cell; 注:使用display:table-cell元素部分出现空白缝隙的问题:设置 . ...
- NOIP-珠心算
题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采用一种快速考察珠心算加 ...
- this全解js
转(掘金) this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JavaScript开发者并不是非常清楚它究竟指向的是什么.听说你很 ...
- oracle 创建的表为什么在table里没有,但是可以查出来
有两种的可能: 1这个表在其他用户下创建的,当前用户没有权限访问,此表不在属于当前用户 2查询时写的表名,并不是真正意义的表名,可能指向其他用户,或者就不是这个表