一、前提概要
今年某天突然無聊,就決定學習.net core,此時的版本已經是.net core 1.1了。之前一直是用.net framework做項目,一直對Html.EditFor()等Html Helper不爽,感覺靈活性太差,此次看了微軟的docs文檔后,感覺到了.net core的強大之處,特別是Tag Helper,便決定投身到此平台中,但在新項目中發現了一個問題:之前做項目都是將數據庫模型放在單獨類庫中,但現在發現.net core 類庫的配置不一樣,總是有問題,於是開始用bing的國際版(順便鄙視下某度)搜索資料,在github的aspnet項目組的issues中和stackoverflowk中搜尋答案,終於找到了解決方法。
二、參考資料
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet#targeting-class-library-projects-is-not-supported
https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-projects/
https://github.com/aspnet/EntityFramework/issues/5320
三、具體解決辦法
1、新建.net core web 應用程序名為TestMigrationInClassLibrary
2、新建一個.net core class library 命名為NetDomain
3、在TestMigrationInClassLibrary引用NetDomain
4、在NetDomain類庫中進行以下步驟:
(1)在*.csproj中添加Microsoft.EntityFrameworkCore.Tools.DotNet
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" /> </ItemGroup>
(2)添加package Microsoft.EntityFrameworkCore.Design
使用cmd控制器,進入該類庫文件夾目錄使用如下命令
dotnet add package Microsoft.EntityFrameworkCore.Design
添加上述兩個必備文件后的*.csproj的最終樣式如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp1.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" /> </ItemGroup> </Project>
(3)利用nuget安裝SqlServer
Install-Package Microsoft.EntityFrameworkCore.SqlServer
(4)添加Model
public class Course { public int ID { get; set; } public string Name { get; set; } public string Remarks { get; set; } }
(5)添加DbContext
public class CourseDbContext : DbContext { public CourseDbContext(DbContextOptions<CourseDbContext> options) : base(options) { } public DbSet<Course> Courses { get; set; } }
(6)添加ContextFactory
public class CourseDbContextFactory : IDbContextFactory<CourseDbContext> { public CourseDbContext Create(DbContextFactoryOptions options) { var optionsBuilder = new DbContextOptionsBuilder<CourseDbContext>(); optionsBuilder.UseSqlServer("Server=(LocalDb)\\MSSQLLocalDB;Database=TestClassLibrary;Trusted_Connection=True;MultipleActiveResultSets=true"); return new CourseDbContext(optionsBuilder.Options); } }
5、在類庫所在目錄下使用如下命令開啟Migration
dotnet ef --startup-project ../TestMigrationInClassLibrary migrations add Initial -c CourseDbContext
要注意"../TestMigrationInClassLibrary"是作為類庫的入口工程,沒有這個入口的話,是無法啟動Migration的。
6、更新數據庫
dotnet ef database update --startup-project ../TestMigrationInClassLibrary
同樣也需要添加入口工程TestMigrationInClassLibrary
四、總結
因為.net core 類庫不像.net standard類庫一樣具有啟動功能,必須指定其他可啟動的工程作為入口,所以每一次的Migration都得加上"--startup-project XXX"。
為了能夠將數據庫模型獨立出來,還是需要費一番周折,但是.net core的其他優點還是遠遠勝於傳統的.net。要想入門.net core,還是建議多看微軟官方的docs和去github中Fork下整個源代碼。