一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

2020-05-20 14:48王杰光 ASP.NET教程

下面小編就為大家分享一篇在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

如果大家剛使用EntityFramework Core作為ORM框架的話,想必都會遇到數據庫遷移的一些問題。

起初我是在ASP.NET Core的Web項目中進行的,但后來發現放在此處并不是很合理,一些關于數據庫的遷移,比如新增表,字段,修改字段類型等等,不應該和最上層的Web項目所關聯,數據的遷移文件放到這里也感覺有點多余,有點亂亂的感覺,所以才想著單獨出來由專門的項目進行管理會比較好,也比較清晰!

注意目標框架選擇的是.NET Core 2.0而不是.NET Standard 2.0

0、前期準備

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <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的類庫,并定義好我們所要使用的數據庫上下文,很簡單,接下來開始我們的正文

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <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,按需引入即可

?
1
2
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-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

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

錯誤提示:

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

解決方法:

在項目文件Light.Repository.csproj中添加以下節點

?
1
2
3
<ItemGroup>
 <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />
</ItemGroup>

重新執行上面的命令,如果出現了EF Core的標志(一頭蓄勢待發的野馬)表示已經成功

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

b)、執行以下命令進行遷移

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

解決方法:

在項目文件中添加以下節點:

?
1
2
3
4
<PropertyGroup>
 <TargetFramework>netcoreapp2.0</TargetFramework>
 <RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>
 </PropertyGroup>

c)、重新執行b步驟的命令,報錯信息如下:

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

錯誤提示:

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

?
1
2
3
4
5
6
7
8
9
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);
  }
 }

再次執行遷移命令,終于成功了。

在.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表字段進行配置,同樣你也可以使用屬性注解的方式進行配置,因為我自己不喜歡“污染”表實體

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
   });
  }

然后同樣使用上面的兩條命令重新遷移并更新數據庫結構

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

觀察數據庫表結構已經更新

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

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

3、擴展

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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來說還沒有達到可以調整數據庫生成字段的順序,不過我們還是可以修改遷移文件的實體屬性的順序來達到我們想要的效果。下面是我調整之后重新生成的表,是不是看出來和上面的有什么不同,一圖勝萬語:

在.NET Core類庫中使用EF Core遷移數據庫到SQL Server的方法

c)、最后一步,自己動手試試看:創建一個SeedData遷移文件來添加數據庫的初始數據。:)

4、最后

EF Core的強大遠不止這些,還有更多的使用方法等著我們去發現,去探索。每天進步一點點,是件很愉快的事情!

原文鏈接:http://www.cnblogs.com/wangjieguang/archive/2017/12/08/EFCore-Migration.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉成人国产精品免费看网站 | 精品久久洲久久久久护士免费 | 欧美日韩中文国产一区二区三区 | 久热在线这里只有精品7 | 成人网18免费网 | 四虎永久网址在线观看 | 久久婷婷丁香五月色综合啪免费 | 果冻传媒九一制片厂网站 | 7mav视频| 国产在线视频第一页 | 亚洲欧美韩国日产综合在线 | 国产精品成人免费 | 女bbbbxxxx视频 | 日韩大片在线播放 | asianfemdom妍妍女王 | 国内精品国语自产拍在线观看55 | 久久精品国产亚洲AV热无遮挡 | 免费黄色片在线观看 | 2020韩国r级理论片在线观看 | 校园全黄h全肉细节文 | 青草悠悠视频在线观看 | 爱爱调教| 精品性影院一区二区三区内射 | 日日摸日日添日日透 | 青涩体验在线观看未删减 | 波多野结衣作品在线观看 | 明星乱淫 | 99九九精品免费视频观看 | 热热99| 午夜在线观看视频 | 四虎精品成人a在线观看 | 久久久91精品国产一区二区 | 日韩高清一区二区三区不卡 | 成人精品在线 | 天天天综合网 | 男人狂擦女人的下面视频 | 男人疯狂进女人下部视频动漫 | 麻豆在线md0087免费 | 欧美日韩综合网在线观看 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 欧美日韩中文字幕一区二区高清 |