簡體   English   中英

ASP.Net核心類庫的實體框架核心遷移

[英]Entity Framework Core Migration for ASP.Net Core Class Library

我一直在嘗試遵循Ben Cull的建議( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-projects ),但是數據庫在我試圖從ASP.NET Core IdentityUser類繼承。 我創建了一個新解決方案,其中包含來自VS2015模板(CodeFirstTest)的默認ASP.NET Core Web應用程序。 然后,我向解決方案中添加了一個ASP.NET Core類庫(CodeFirstTest.User),這將是應用程序中的數據層,並且我還將在其中設置ASP.NET Core標識。

遵循Ben Cull的建議,我重新編寫了CodeFirstTest.User project.json,如下所示。

{
  "version": "1.0.0-*",

  "buildOptions": {
    "emitEntryPoint": true
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.Extensions.Configuration": "1.0.1",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.EntityFrameworkCore.Design": "1.0.1",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0"
  },

  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  }
}

我還創建了一個包含入口點的Program.cs文件,以及一個從ASP.NET Core IdentityUser繼承的User類,如下所示。

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace CodeFirstTest.User
{
    public class Program
    {
        public static void Main(string[] args) { }
    }

    public class User : IdentityUser
    {

    }

    public class UserIdentityDbContext : IdentityDbContext<User>
    {
        public UserIdentityDbContext(DbContextOptions options)
        {

        }
    }

    public class TemporaryDbContextFactory : IDbContextFactory<UserIdentityDbContext>
    {
        public UserIdentityDbContext Create(DbContextFactoryOptions options)
        {
            var builder = new DbContextOptionsBuilder<UserIdentityDbContext>();
            builder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=UserDb;Trusted_Connection=SqlTruncateException;MultipleActiveResultSets=true");
            return new UserIdentityDbContext(builder.Options);
        }
    }
}

當我使用Project Manager控制台創建初始遷移時,收到以下錯誤。

PM> Add-Migration -Name "Initial" -Project "CodeFirstTest.User"
Could not invoke this command with the startup project 'CodeFirstTest'. Check that 'Microsoft.EntityFrameworkCore.Design' has been added to "dependencies" in the startup project and that the version of 'Microsoft.EntityFrameworkCore.Tools' in "tools" and 'Microsoft.EntityFrameworkCore.Design' are the same. See http://go.microsoft.com/fwlink/?LinkId=798221 for more details.
PM> Add-Migration -Name "Initial" -Project "CodeFirstTest.User"
Unhandled Exception: System.MissingMethodException: Entry point not found in assembly 'Microsoft.EntityFrameworkCore.Design, Version=1.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

我更正了第一個錯誤,但第二次運行將導致dotnet失敗,並顯示“未處理的異常”錯誤。 問題...我是否編碼錯誤,阻止遷移執行?

謝謝。

更新:現在,這個答案似乎已經過時了! 原來1.1已經刪除了此功能。 升級到1.1后,它將不再起作用。 奇怪的是,這將停止工作。 正如Ben Cull所建議的那樣,設置類庫使其像控制台應用程序一樣工作是使用EF Core 1.1時處理它的方法


那篇博客文章很老。 .Net Core發行之前的大多數內容(盡管通常仍然有用)仍然需要加一點鹽。

您不再需要偽造類庫中的控制台應用程序。 我一起整理了一個示例身份應用程序,其中User和DbContext位於類庫中。

類庫project.json看起來像這樣:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Microsoft.EntityFrameworkCore": "1.0.1",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview4-final"
  },
  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview4-final"
  },
  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}

顯示遷移中出現的ClassLibrary命名空間和身份架構。

成功范例

注意一些細微的事情:

  • 將DbContext構造函數中的選項傳遞給基本構造函數
  • WebApplication是啟動項目。 程序包管理器控制台中的默認項目是類庫。 這樣一來,它便知道在哪里可以找到啟動程序。

如果您要使用它作為基准,那么我整理的整個示例解決方案都放在Github上

對於核心1.1,在添加帶有nuget的軟件包后,它將無法直接運行,您還需要像這樣編輯.csproj文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore" Version="1.1.2" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
  </ItemGroup>

</Project>

參考: https : //www.benday.com/2017/02/14/walkthrough-entity-framework-core-1-1-with-migrations/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM