將數據庫模型放入到.Net Core的類庫中


一、前提概要

      今年某天突然無聊,就決定學習.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下整個源代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM