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

asp.net-core-mvc entity-framework-core

我一直在努力遵循Ben Cull的建議( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-projects ),但數據庫有點不同我正在嘗試從ASP.NET Core IdentityUser類繼承。我創建了一個新的解決方案,其中包含VS2015模板(CodeFirstTest)中的默認ASP.NET核心Web應用程序。然後我在解決方案中添加了一個ASP.NET Core類庫(CodeFirstTest.User),該解決方案將是應用程序中的數據層,我將在其中設置ASP.NET Core Identity。

按照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 Console創建初始遷移時,我收到以下錯誤。

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是啟動項目。程序包管理器控制台中的默認項目是類庫。這樣它就知道在哪裡可以找到Startup。

如果你想把它作為一個基線,我把整個示例解決方案放在Github上


熱門答案

對於使用nuget添加軟件包後的核心1.1它將無法直接工作,您還需要編輯.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/



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因