如何在.NET Core类库中使用EF Core迁移数据库到SQL Server
创始人
2024-11-27 20:43:29
0次

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

0、前期准备

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

/// 
 /// 系统应用的用户实体
 /// 
 public class ApplicationUser : BaseModel
 {
  /// 
  /// 用户名
  /// 
  public string UserName { get; set; }
  /// 
  /// 密码
  /// 
  public string Password { get; set; }
  /// 
  /// 邮件地址
  /// 
  public string Email { get; set; }
 }

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

/// 
 /// 系统上下文
 /// 
 public class LightContext : DbContext
 {
  public LightContext(DbContextOptions options) : base(options)
  {
  }
  /// 
  /// 系统应用用户
  /// 
  public DbSet ApplicationUser { get; set; }
  /// 
  /// 角色表
  /// 
  public DbSet Role { get; set; }
 }

1、问题汇总

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

Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools

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

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

错误提示:

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

解决方法:

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


 

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

dotnet ef migrations add InitLightDB

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

错误提示:

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

解决方法:

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


 netcoreapp2.0
 2.0.3
 

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

错误提示:

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

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

解决方法:

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

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory
 {
  public LightContext CreateDbContext(string[] args)
  {
   var builder = new DbContextOptionsBuilder();
   builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");
   return new LightContext(builder.Options);
  }
 }

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

成功提示:

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

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

2、小试迁移命令

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

dotnet ef database update

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

public static void ConfigApplicationUser(ModelBuilder modelBuilder)
  {
   modelBuilder.Entity(m =>
   {
    m.Property(t => t.Email)
      .HasMaxLength(50);
    m.Property(t => t.UserName)
      .IsRequired()
      .HasMaxLength(50);
    m.Property(t => t.Password)
      .IsRequired()
      .HasMaxLength(20);
   });
  }

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

3、扩展

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

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory
 {
  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();
   //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来说还没有达到可以调整数据库生成字段的顺序,不过我们还是可以修改迁移文件的实体属性的顺序来达到我们想要的效果。下面是我调整之后重新生成的表,是不是看出来和上面的有什么不同,一图胜万语:

如何在.NET Core类库中使用EF Core迁移数据库到SQL Server

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

4、最后

EF Core的强大远不止这些,还有更多的使用方法等着我们去发现,去探索。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...