溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

發(fā)布時(shí)間:2021-07-24 14:23:28 來源:億速云 閱讀:274 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

注意目標(biāo)框架選擇的是.NET Core 2.0而不是.NET Standard 2.0。

0、前期準(zhǔn)備

a)、表實(shí)體定義,這個(gè)是在.NET Standard 2.0的類庫中存放的。

/// <summary>
 /// 系統(tǒng)應(yīng)用的用戶實(shí)體
 /// </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)、新建一個(gè).NET Core 2.0的類庫,并定義好我們所要使用的數(shù)據(jù)庫上下文,很簡單,接下來開始我們的正文

/// <summary>
 /// 系統(tǒng)上下文
 /// </summary>
 public class LightContext : DbContext
 {
  public LightContext(DbContextOptions<LightContext> options) : base(options)
  {
  }
  /// <summary>
  /// 系統(tǒng)應(yīng)用用戶
  /// </summary>
  public DbSet<ApplicationUser> ApplicationUser { get; set; }
  /// <summary>
  /// 角色表
  /// </summary>
  public DbSet<Role> Role { get; set; }
 }

1、問題匯總

首先要確保倉儲(chǔ)類庫中已經(jīng)引入以下兩個(gè)Nuget包,沒有的話請(qǐng)使用包管理器進(jìn)行安裝。不建議直接引入原包:Microsoft.AspNetCore.All,按需引入即可

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

a)打開CMD,然后切換到類庫所在路徑下,執(zhí)行以下命令。不過你也可以使用程序包管理器控制臺(tái)(PMC)進(jìn)行遷移,但是會(huì)有少許變化,部分命令見下表:

遷移命令描述CMD命令PMC命令
創(chuàng)建遷移:migrationname為遷移名稱dotnet ef migrations add migrationnameadd-migration migrationname
移除遷移(刪除最近的一次遷移)dotnet ef migrations removeremove-migration
應(yīng)用最新的遷移(使遷移文件應(yīng)用到數(shù)據(jù)庫)dotnet ef database updateupdate-database
應(yīng)用指定的遷移dotnet ef database update migrationnameupdate-database migrationname
查看遷移列表dotnet ef migrations list
查看數(shù)據(jù)庫上下文信息dotnet ef dbcontext info
dotnet ef

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

錯(cuò)誤提示:

未找到與命令“dotnet-ef”匹配的可執(zhí)行文件

解決方法:

在項(xiàng)目文件Light.Repository.csproj中添加以下節(jié)點(diǎn)

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

重新執(zhí)行上面的命令,如果出現(xiàn)了EF Core的標(biāo)志(一頭蓄勢待發(fā)的野馬)表示已經(jīng)成功

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

b)、執(zhí)行以下命令進(jìn)行遷移

dotnet ef migrations add InitLightDB

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

錯(cuò)誤提示:

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

解決方法:

在項(xiàng)目文件中添加以下節(jié)點(diǎn):

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

c)、重新執(zhí)行b步驟的命令,報(bào)錯(cuò)信息如下:

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

錯(cuò)誤提示:

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.

這個(gè)問題如果是在Web項(xiàng)目,并且配置了DbContext的鏈接字符串的話,是不會(huì)出現(xiàn)此問題的。很顯然是遷移命令沒有找到DbConnectionString導(dǎo)致的,接下來我們按照提示,實(shí)現(xiàn)一個(gè)IDesignTimeDbContextFactory<LightContext>試試

解決方法:

創(chuàng)建一個(gè)與DbContext同一目錄下的DesignTimeDbContextFactory文件,然后實(shí)現(xiàn)接口中的方法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);
  }
 }

再次執(zhí)行遷移命令,終于成功了。

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

成功提示:

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

同時(shí)類庫下面會(huì)生成Migrations文件夾以及相關(guān)的遷移文件

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

2、小試遷移命令

a)、使用以下命令應(yīng)用遷移,生成數(shù)據(jù)庫和表

dotnet ef database update

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

通過VS的SQL Server資源管理器查看生成數(shù)據(jù)庫的結(jié)構(gòu),其中__EFMigrationsHistory為每次遷移的記錄表

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

b)、因?yàn)閟tring類型的字段遷移到數(shù)據(jù)庫之后的數(shù)據(jù)類型為nvarchar(max)并且是可空類型的,下面我們就使用Fluent API對(duì)ApplicationUser表字段進(jìn)行配置,同樣你也可以使用屬性注解的方式進(jìn)行配置,因?yàn)槲易约翰幌矚g“污染”表實(shí)體

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);
   });
  }

然后同樣使用上面的兩條命令重新遷移并更新數(shù)據(jù)庫結(jié)構(gòu)

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

觀察數(shù)據(jù)庫表結(jié)構(gòu)已經(jīng)更新

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

同理添加字段,刪除字段都是一樣的遷移操作,還是很方便的

3、擴(kuò)展

a)、為了方便演示,其實(shí)上面在類庫中執(zhí)行遷移時(shí)的數(shù)據(jù)庫連接字符串是寫死的,那么最好的辦法是應(yīng)該去讀取Web項(xiàng)目下已經(jīng)配置好的連接,這樣就能保證上下的一致性,不用再去為了EF的遷移而單獨(dú)維護(hù)一個(gè)多余的數(shù)據(jù)庫連接配置。改造也很簡單,即通過Configuration組件讀取appsettings.json的ConnectionStrings節(jié)點(diǎn),改造之后是這樣子的:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>
 {
  public LightContext CreateDbContext(string[] args)
  {
   Directory.SetCurrentDirectory("..");//設(shè)置當(dāng)前路徑為當(dāng)前解決方案的路徑
   string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的項(xiàng)目名稱
   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);
  }
 }

注意需要額外引入下面這個(gè)Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、屬性注解[Column(Order = 1)]對(duì)EF Core來說還沒有達(dá)到可以調(diào)整數(shù)據(jù)庫生成字段的順序,不過我們還是可以修改遷移文件的實(shí)體屬性的順序來達(dá)到我們想要的效果。下面是我調(diào)整之后重新生成的表,是不是看出來和上面的有什么不同,一圖勝萬語:

如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server

c)、最后一步,自己動(dòng)手試試看:創(chuàng)建一個(gè)SeedData遷移文件來添加數(shù)據(jù)庫的初始數(shù)據(jù)。:)

4、最后

EF Core的強(qiáng)大遠(yuǎn)不止這些,還有更多的使用方法等著我們?nèi)グl(fā)現(xiàn),去探索。

感謝各位的閱讀!關(guān)于“如何在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI