<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

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

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:35:16
        文檔

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

        在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法:前言 如果大家剛使用EntityFramework Core作為ORM框架的話,想必都會(huì)遇到數(shù)據(jù)庫遷移的一些問題。 起初我是在ASP.NET Core的Web項(xiàng)目中進(jìn)行的,但后來發(fā)現(xiàn)放在此處并不是很合理,一些關(guān)于數(shù)據(jù)庫的遷移,比如新增表,字段,修改字段類型等等,不應(yīng)該和最上層的W
        推薦度:
        導(dǎo)讀在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法:前言 如果大家剛使用EntityFramework Core作為ORM框架的話,想必都會(huì)遇到數(shù)據(jù)庫遷移的一些問題。 起初我是在ASP.NET Core的Web項(xiàng)目中進(jìn)行的,但后來發(fā)現(xiàn)放在此處并不是很合理,一些關(guān)于數(shù)據(jù)庫的遷移,比如新增表,字段,修改字段類型等等,不應(yīng)該和最上層的W

        前言

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

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

        注意目標(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 migrationname add-migration migrationname
        移除遷移(刪除最近的一次遷移) dotnet ef migrations remove remove-migration
        應(yīng)用最新的遷移(使遷移文件應(yīng)用到數(shù)據(jù)庫) dotnet ef database update update-database
        應(yīng)用指定的遷移 dotnet ef database update migrationname update-database migrationname
        查看遷移列表 dotnet ef migrations list
        查看數(shù)據(jù)庫上下文信息 dotnet ef dbcontext info

        dotnet ef

        錯(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)志(一頭蓄勢(shì)待發(fā)的野馬)表示已經(jīng)成功

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

        dotnet ef migrations add InitLightDB

        錯(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ò)信息如下:

        錯(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í)行遷移命令,終于成功了。

        成功提示:

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

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

        2、小試遷移命令

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

        dotnet ef database update

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

        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)

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

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

        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)整之后重新生成的表,是不是看出來和上面的有什么不同,一圖勝萬語:

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

        4、最后

        EF Core的強(qiáng)大遠(yuǎn)不止這些,還有更多的使用方法等著我們?nèi)グl(fā)現(xiàn),去探索。每天進(jìn)步一點(diǎn)點(diǎn),是件很愉快的事情!

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法:前言 如果大家剛使用EntityFramework Core作為ORM框架的話,想必都會(huì)遇到數(shù)據(jù)庫遷移的一些問題。 起初我是在ASP.NET Core的Web項(xiàng)目中進(jìn)行的,但后來發(fā)現(xiàn)放在此處并不是很合理,一些關(guān)于數(shù)據(jù)庫的遷移,比如新增表,字段,修改字段類型等等,不應(yīng)該和最上層的W
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲AV无码第一区二区三区| 国产亚洲精品a在线无码| 亚洲中字慕日产2020| 在免费jizzjizz在线播| 久久丫精品国产亚洲av| 中文字幕亚洲免费无线观看日本 | 亚洲首页国产精品丝袜| 亚洲免费二区三区| 亚洲毛片免费视频| 黄页网站在线看免费| 亚洲中文无码永久免| 国产91在线免费| AAAAA级少妇高潮大片免费看| 狠狠亚洲婷婷综合色香五月排名| 中文字幕免费在线视频| 久久精品亚洲一区二区| 99精品免费观看| 亚洲午夜在线播放| 免费人成在线观看网站视频| 精品国产免费人成网站| 亚洲国产精品无码久久一线| 最近中文字幕2019高清免费| 男人天堂2018亚洲男人天堂| 亚洲M码 欧洲S码SSS222| 日本免费一区二区久久人人澡| 亚洲精品mv在线观看| 国产无遮挡吃胸膜奶免费看| 黄网站色视频免费看无下截 | 亚洲国产成人乱码精品女人久久久不卡| 色多多A级毛片免费看| 亚洲av最新在线网址| 日韩免费一区二区三区在线| 久久综合亚洲色hezyo| 亚洲国产婷婷六月丁香| 91香蕉视频免费| 一区二区免费在线观看| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲精品无码久久久久AV麻豆| 日韩精品免费在线视频| 亚洲av日韩综合一区二区三区| 亚洲精品无码鲁网中文电影|