EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例
场景
在一个项目中,使用了多个 DbContext
且使用同一个数据库的情况
创建新项目
打开 Visual Studio 2017
“文件”>“新建”>“项目”
从左菜单中选择“已安装”>“Visual C#”>“.NET Core”。
选择“ASP.NET Core Web 应用程序”。
输入“WebApplication”作为名称,然后单击“确定”。
在“新建 ASP.NET Core Web 应用程序”对话框中:
确保在下拉列表中选择“.NET Core”和“ASP.NET Core 2.1”
选择“Web 应用程序(模型视图控制器)”项目模板
确保将“身份验证”设置为“无身份验证”
单击“确定”
创建第一个模型
右键单击“Models”文件夹,然后选择“添加”>“类”。
输入“FirstModel.cs”作为名称,然后单击“确定”。
将此文件的内容替换为以下代码:
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore; namespace WebApplication.Models
{
public class FirstDbContext : DbContext
{
public FirstDbContext(DbContextOptions<FirstDbContext> options)
: base(options)
{ } public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; } public ICollection<Post> Posts { get; set; }
} public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public Blog Blog { get; set; }
}
}
生产应用通常会将每个类放在单独的文件中。 为简单起见,本教程将这些类放在一个文件中。
创建第二个模型
右键单击“Models”文件夹,然后选择“添加”>“类”。
输入“SecondModel.cs”作为名称,然后单击“确定”。
将此文件的内容替换为以下代码:
using Microsoft.EntityFrameworkCore; namespace WebApplication.Models
{
public class SecondDbContext : DbContext
{
public SecondDbContext(DbContextOptions<SecondDbContext> options)
: base(options)
{ } public DbSet<Student> Students { get; set; }
} public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
}
生产应用通常会将每个类放在单独的文件中。 为简单起见,本教程将这些类放在一个文件中。
至此,项目的目录结构如下:
使用依赖注入注册上下文
若要使 FirstDbContext
和 SecondDbContext
可用于 MVC 控制器,请在 Startup.cs
中将其注册为服务。
在应用程序启动过程中,通过依赖关系注入 注册服务(如 FirstDbContext),以便能够通过构造函数的参数和属性向使用服务的组件(如 MVC 控制器)自动提供该服务。
在 Startup.cs 中,添加以下 using 语句:
using WebApplication.Models;
using Microsoft.EntityFrameworkCore;
将以下
手动高亮
的代码添加到ConfigureServices
方法: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;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); var connection = @"Server=你的数据库地址;Database=MultipleDbContext;User Id=你的数据库账号;Password=你的数据库密码;"; // 手动高亮
services.AddDbContext<FirstDbContext> // 手动高亮
(options => options.UseSqlServer(connection, x => x.MigrationsHistoryTable("__FirstDbMigrationsHistory"))); // 手动高亮 services.AddDbContext<SecondDbContext> // 手动高亮
(options => options.UseSqlServer(connection, x => x.MigrationsHistoryTable("__SecondDbMigrationsHistory"))); // 手动高亮
}
生产应用通常会将连接字符串放在配置文件或环境变量中。 为简单起见,本教程在代码中定义它。
创建数据库
以下步骤使用迁移创建数据库。
“工具”>“NuGet 包管理器”>“包管理器控制台”
运行以下命令创建
FirstDbContext
的迁移:Add-Migration InitialCreate -Context FirstDbContext -OutputDir Migrations\FirstDbContextMigrations
Update-Database -Context FirstDbContext
-Context 参数表示要使用的
DbContext
类,请参阅这里了解详细信息。“工具”>“NuGet 包管理器”>“包管理器控制台”
运行以下命令创建
SecondDbContext
的迁移:Add-Migration InitialCreate -Context SecondDbContext -OutputDir Migrations\SecondDbContextMigrations
Update-Database -Context SecondDbContext
至此,项目的目录结构如下:
数据库如下:
需要注意的情况
请避免两个 DBContext
内的实体有互相主外键连接的情况
示例
// FirstDbContext
public class FirstDbContext : DbContext
{
public FirstDbContext(DbContextOptions<FirstDbContext> options)
: base(options)
{ } public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; } public ICollection<Post> Posts { get; set; } public int StudentId { get; set; }
public Student Student { get; set; }
} public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public Blog Blog { get; set; }
} // SecondDbContext
public class SecondDbContext : DbContext
{
public SecondDbContext(DbContextOptions<SecondDbContext> options)
: base(options)
{ } public DbSet<Student> Students { get; set; }
} public class Student
{
public int Id { get; set; }
public string Name { get; set; } public ICollection<Blog> Blogs { get; set; }
}
EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例的更多相关文章
- EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...
- EF Core 快速上手——创建应用的DbContext
系列文章 EF Core 快速上手--EF Core 入门 EF Core 快速上手--EF Core的三种主要关系类型 本节导航 定义应用的DbContext 创建DbContext的一个实例 创建 ...
- [.NET Core] - 使用 EF Core 的 Scaffold-DbContext 脚手架命令创建 DbContext
Scaffold-DbContext 命令 参数 Scaffold-DbContext [-Connection] <String> [-Provider] <String> ...
- [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型
官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...
- 第三节:EF Core上下文DbContext相关配置和生命周期
一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...
- EF Core 2.0 新特性
前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
- EF Core使用笔记(基于MySql数据库)
一.什么是EF Entity Framework 是适用于.NET 的对象关系映射程序 (O/RM). 二.比较 EF Core 和 EF6 1.Entity Framework 6 Entity F ...
随机推荐
- Docke--基础篇
什么是Docker? Docker 最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并与2013年3月 ...
- yii2 gridview默认排序
Yii2 GridView 使用起来很方便,但是默认排序很是个问题,数据默认按 主键 正序排列 但是在使用过程中,大多数数据默认是 倒序才符合正常思维的. 第一次 的解决方法是在 直接为 Model添 ...
- Apache 解析.htaccess
解决.htaccess不解析 输入a2enmod rewrite 修改/etc/apache.conf 此处改为ALL
- Transformer【Attention is all you need】
前言 Transfomer是一种encoder-decoder模型,在机器翻译领域主要就是通过encoder-decoder即seq2seq,将源语言(x1, x2 ... xn) 通过编码,再解码的 ...
- SVN状态说明
svn status查看工作副本中目录与文件的状态 命令格式:svn status [PATH](简写:svn st) 打印工作拷贝中文件和目录的状态. svn st|grep ^状态(获得某状态文件 ...
- JGUI源码:实现简单进度条(19)
程序效果如下 实现进度条动画主要有两种方法:(1)使用缓动,(2)使用Jquery Animate,本文使用第二种方法,先实现代码,后续进行控件封装 <style> .jgui-proce ...
- PHP和JS在循环、条件判断中的不同之处
一.条件判断: php中算 false 的情况 1. boolean:false 2. 整形:0 3.浮点型:0 4.字符串:"" "0"(其他都对) 5.空 ...
- UTF-8字符C2A0引起的问题
今天遇到一个问题: 网页上的一段文字中有几个空格,把这段文字当作文件名称保存为一个windows系统下的文件后,文件名中本来是空格的地方变成了问号,另外一个C#程序打开这个文件,也提示找不到文件. 初 ...
- java hashmap的一些分析记录
最近朋友去面试被问了些hashmap相关的问题,hashmap的初始容量啊,什么操作最耗时等,之前看过hashmap的源码,正好这里也在总结下. 主要围绕下面几个点: HashMap是由数组+链表(j ...
- [转] GloVe公式推导
from: https://pengfoo.com/post/machine-learning/2017-04-11 GloVe(Global Vectors for Word Representat ...