前言

如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题。

起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段,修改字段类型等等,不应该和最上层的Web项目所关联,数据的迁移文件放到这里也感觉有点多余,有点乱乱的感觉,所以才想着单独出来由专门的项目进行管理会比较好,也比较清晰!

注意目标框架选择的是.NET Core 2.0而不是.NET Standard 2.0。

0、前期准备

a)、表实体定义,这个是在.NET Standard 2.0的类库中存放的。

/// <summary>

/// 系统应用的用户实体

/// </summary>

public class ApplicationUser : BaseModel

{

/// <summary>

/// 用户名

/// </summary>

public string UserName { get; set; }

/// <summary>

/// 密码

/// </summary>

public string Password { get; set; }

/// <summary>

/// 邮件地址

/// </summary>

public string Email { get; set; }

}

b)、新建一个.NET Core 2.0的类库,并定义好我们所要使用的数据库上下文,很简单,接下来开始我们的正文

/// <summary>

/// 系统上下文

/// </summary>

public class LightContext : DbContext

{

public LightContext(DbContextOptions<LightContext> options) : base(options)

{

}

/// <summary>

/// 系统应用用户

/// </summary>

public DbSet<ApplicationUser> ApplicationUser { get; set; }

/// <summary>

/// 角色表

/// </summary>

public DbSet<Role> Role { get; set; }

}

1、问题汇总

首先要确保仓储类库中已经引入以下两个Nuget包,没有的话请使用包管理器进行安装。不建议直接引入原包:Microsoft.AspNetCore.All,按需引入即可

Install-Package Microsoft.EntityFrameworkCore.SqlServerInstall-Package Microsoft.EntityFrameworkCore.Tools

a)打开CMD,然后切换到类库所在路径下,执行以下命令。不过你也可以使用程序包管理器控制台(PMC)进行迁移,但是会有少许变化,部分命令见下表:

迁移命令描述 CMD命令 PMC命令
创建迁移:migrationname为迁移名称 dotnet ef migrations add migrationname add-migration migrationname
移除迁移(删除最近的一次迁移) dotnet ef migrations remove remove-migration
应用最新的迁移(使迁移文件应用到数据库) dotnet ef database update update-database
应用指定的迁移 dotnet ef database update migrationname update-database migrationname
查看迁移列表 dotnet ef migrations list
查看数据库上下文信息 dotnet ef dbcontext info
dotnet ef

错误提示:

  未找到与命令“dotnet-ef”匹配的可执行文件

解决方法:

  在项目文件Light.Repository.csproj中添加以下节点

<ItemGroup><DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" /></ItemGroup>

重新执行上面的命令,如果出现了EF Core的标志(一头蓄势待发的野马)表示已经成功

b)、执行以下命令进行迁移

dotnet ef migrations add InitLightDB

错误提示:

The specified framework version '2.0' could not be parsed
The specified framework 'Microsoft.NETCore.App', version '2.0' was not found.
- Check application dependencies and target a framework version installed at:
\
- Alternatively, install the framework version '2.0'.

解决方法:

  在项目文件中添加以下节点:

  <PropertyGroup><TargetFramework>netcoreapp2.0</TargetFramework><RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion></PropertyGroup>

c)、重新执行b步骤的命令,报错信息如下:

错误提示:

  Unable to create an object of type 'LightContext'. Add an implementation of 'IDesignTimeDbContextFactory<LightContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

这个问题如果是在Web项目,并且配置了DbContext的链接字符串的话,是不会出现此问题的。很显然是迁移命令没有找到DbConnectionString导致的,接下来我们按照提示,实现一个IDesignTimeDbContextFactory<LightContext>试试

解决方法:

  创建一个与DbContext同一目录下的DesignTimeDbContextFactory文件,然后实现接口中的方法CreateDbContext,并配置ConnectionString

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>

{

public LightContext CreateDbContext(string[] args)

{

var builder = new DbContextOptionsBuilder<LightContext>();

builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

return new LightContext(builder.Options);

}

}

再次执行迁移命令,终于成功了。

成功提示:

  Done. To undo this action, use 'ef migrations remove'

同时类库下面会生成Migrations文件夹以及相关的迁移文件

2、小试迁移命令

a)、使用以下命令应用迁移,生成数据库和表

dotnet ef database update

通过VS的SQL Server资源管理器查看生成数据库的结构,其中__EFMigrationsHistory为每次迁移的记录表

b)、因为string类型的字段迁移到数据库之后的数据类型为nvarchar(max)并且是可空类型的,下面我们就使用Fluent API对ApplicationUser表字段进行配置,同样你也可以使用属性注解的方式进行配置,因为我自己不喜欢“污染”表实体

public static void ConfigApplicationUser(ModelBuilder modelBuilder)

{

modelBuilder.Entity<ApplicationUser>(m =>

{

m.Property(t => t.Email)

.HasMaxLength(50);

m.Property(t => t.UserName)

.IsRequired()

.HasMaxLength(50);

m.Property(t => t.Password)

.IsRequired()

.HasMaxLength(20);

});

}

然后同样使用上面的两条命令重新迁移并更新数据库结构

观察数据库表结构已经更新

同理添加字段,删除字段都是一样的迁移操作,还是很方便的

3、扩展

a)、为了方便演示,其实上面在类库中执行迁移时的数据库连接字符串是写死的,那么最好的办法是应该去读取Web项目下已经配置好的连接,这样就能保证上下的一致性,不用再去为了EF的迁移而单独维护一个多余的数据库连接配置。改造也很简单,即通过Configuration组件读取appsettings.json的ConnectionStrings节点,改造之后是这样子的:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>

{

public LightContext CreateDbContext(string[] args)

{

Directory.SetCurrentDirectory("..");//设置当前路径为当前解决方案的路径

string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的项目名称

var configBuilder = new ConfigurationBuilder()

.SetBasePath(appSettingBasePath)

.AddJsonFile("appsettings.json")

.Build();

var builder = new DbContextOptionsBuilder<LightContext>();

//builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

builder.UseSqlServer(configBuilder.GetConnectionString("LightConnection"));

return new LightContext(builder.Options);

}

}

注意需要额外引入下面这个Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、属性注解[Column(Order = 1)]对EF Core来说还没有达到可以调整数据库生成字段的顺序,不过我们还是可以修改迁移文件的实体属性的顺序来达到我们想要的效果。下面是我调整之后重新生成的表,是不是看出来和上面的有什么不同,一图胜万语:

c)、最后一步,自己动手试试看:创建一个SeedData迁移文件来添加数据库的初始数据。:)

4、最后

EF Core的强大远不止这些,还有更多的使用方法等着我们去发现,去探索。每天进步一点点,是件很愉快的事情!

原文:http://www.cnblogs.com/wangjieguang/p/EFCore-Migration.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

在.NET Core类库中使用EF Core迁移数据库到SQL Server相关推荐

  1. (一)NET Core 项目中通过EF Core的Code First方式进行数据库的迁移

    EF Core 是现有EF库的修改版本,具有可扩展的,轻量级的和跨平台的支持.它支持关系型数据库和非关系型数据库.还支持"代码优先"或"数据库优先"方法作为编程 ...

  2. 关于Java中的JDBC使用和数据库(SQL Server)连接之后的一些操作

    1.首先是java连接数据库的一些准备 (1)打开SQL Server数据库的配置管理器: 如果打不开数据库的话可以在命令行窗口:cmd->SQLServerManager14.msc 点击SQ ...

  3. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

  4. 万字长文,带你彻底理解EF Core 5的运行机制,让你成为团队中的EF Core专家

    目录 1.将EF的ToTraceString移植为EF Core的ToQueryString 2.从EF Core记录详细信息 2.1. 简单的日志记录 2.2.响应EF Core 事件 2.3.使用 ...

  5. .NET 5中的EF Core 5数据迁移:在单独的库中并自动部署

    目录 1.简介 2.先决条件 3.使用Dotnet CLI创建解决方案和项目框架 4.在DataAcess中创建模型和数据上下文 5.在WebApp中启动数据库 6.添加数据迁移功能 7.更改数据库模 ...

  6. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  7. 在VisualStudio中使用EF操作Firebird数据库

    在VisualStudio中使用EF操作Firebird数据库 因项目需要,笔者需要在VS2019中使用EF操作Firebird数据库.但Firebird在国内算是一款非常小众的关系型数据库,由于用的 ...

  8. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008

    SQL Server 2008中Analysis Services的新特性 --深入SQL Server 2008 内容简介: 本书涵盖了SQL Server 2008引入的新功能.作者之一Rober ...

  9. 【转载】在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库

    在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库 SQLDMO(SQL Distributed Management Objects,SQL分布式管理对象)封装了Mic ...

最新文章

  1. linux指令 2>1 到底是个啥
  2. BackboneFast
  3. aop对请求后端的参数修改_Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理...
  4. 分享个人预算系统源码(含说明文档)
  5. P4824 [USACO15FEB]Censoring S kmp + 栈
  6. dat14-memcached
  7. SAP License:ERP的意义
  8. SQl 2000和SQL 2005之间的一些语法区别
  9. 洛谷P6140 [USACO07NOV]Best Cow Line S
  10. java中h1.j有什么作用_Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)...
  11. 愁绪千万端,扰乱不成眠——如何修复Noise?
  12. 深度学习:卷积神经网络CNN变体
  13. (转)android之Fragment(官网资料翻译)
  14. 如何解决谷歌云盘wget无法下载大文件的问题
  15. 国内主流物流公司常用快递单号查询API接口全攻略
  16. Linux从入门到放弃 docker
  17. 鸿蒙跨屏流转是什么,华为智慧屏SE系列评测:从用上到爱上 就是一“眼”之间...
  18. 解决PS内存不足的错误
  19. 结构光三维重建之光栅图像相位解算(MATLAB)
  20. 安全尽职是企业的阿克琉斯之踵

热门文章

  1. PostgreSQL 最佳实践 - 水平分库(基于plproxy)
  2. 重构第12天 分解依赖(Break Dependencies)
  3. 【读书笔记】《编写高效的JavaScript程序》
  4. Asp.net中的HttpModule和HttpHandler的简单用法
  5. 使用Brighter实现轻量型独立管道
  6. ABP vNext微服务架构详细教程——身份管理服务
  7. 微软推出 .NET 官方社区论坛
  8. 使用zipKin构建NetCore分布式链路跟踪
  9. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)
  10. InfluxDB 2.0 之Flux语法篇