Asp.net core mvc ASP.Net核心类库的实体框架核心迁移

Asp.net core mvc ASP.Net核心类库的实体框架核心迁移,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我一直在尝试遵循Ben Cull()的建议,但数据库有点不同,因为我尝试从ASP.NET核心IdentityUser类继承。我从VS2015模板(CodeFirstTest)创建了一个包含默认ASP.NET核心Web应用程序的新解决方案。然后,我向解决方案中添加了一个ASP.NET核心类库(CodeFirstTest.User),它将是应用程序中的数据层,我还将在其中设置ASP.NET核心标识 按照Ben Cull的建议,我重写了CodeFirstTest.User project.json,如

我一直在尝试遵循Ben Cull()的建议,但数据库有点不同,因为我尝试从ASP.NET核心IdentityUser类继承。我从VS2015模板(CodeFirstTest)创建了一个包含默认ASP.NET核心Web应用程序的新解决方案。然后,我向解决方案中添加了一个ASP.NET核心类库(CodeFirstTest.User),它将是应用程序中的数据层,我还将在其中设置ASP.NET核心标识

按照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继承的用户类,如下所示

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);
        }
    }
}
我更正了第一个错误,但第二次运行将导致dotnet失败,并出现“未处理的异常”错误。 问题是。。。 我是否编写了错误的代码来阻止迁移的执行


谢谢。

更新:现在这个答案似乎过时了!原来1.1已经删除了这个功能。升级到1.1后,它不再工作。奇怪的是,这会停止工作。在使用EF Core 1.1时,按照Ben Cull的建议,将类库设置为像控制台应用程序一样工作似乎是一种处理方法


那篇博客文章很老了。在.NETCore发布之前的大多数东西虽然通常仍然有用,但需要谨慎对待

您不再需要在类库中伪造控制台应用程序。我创建了一个示例身份应用程序,其中用户和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"
    }
  }
}
显示迁移过程中通过的类库名称空间和标识模式

需要注意的一些微妙的事情:

  • 将DbContext构造函数中的选项传递给基构造函数
  • WebApplication是启动项目。包管理器控制台中的默认项目是类库。这是为了让它知道在哪里可以找到新公司
如果您想将其用作基线,那么我所提供的整个示例解决方案都已经提供了

对于核心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>

netcoreapp1.1

参考资料:

我刚看了一下,看起来您仍然需要将类库转换为应用程序(至少在VS2017和工具正确发布之前)。我目前使用的是ETHECLI工具(dotnet ef迁移),而不是powershell工具,但两者的工作原理基本相同。请非常小心您的版本,只有特定的组合才能正常工作。请查看下面Dave答案中的版本,并使用他的Github项目作为参考。让我知道他们是否真的工作:)我相信这可能是问题所在。我相信我不知道CLI工具不适合我,除非我做了应用程序的处理,但是当他(和我)使用包管理器控制台时,我没有考虑这个事实,我宁愿不这样做。我也用VS 2015社区作为例子。首先,我道歉,因为我被另一个项目拖了29天。其次,通过检查发布的启动项目,我能够完成初始迁移。为了完成迁移,我做了两个更改。对问题中所列代码的第一个更改是对上述问题中所列代码的第一个更改是` public UserIdentityDbContext(DbContextOptions):base(options){}`我还向CodeFirstTest项目的依赖项添加了“CodeFirstTest.User”:“1.0.0-*”,1)为了真正分离关注点,DbContext初始化是否也需要转移到类库项目?在您的代码中,它仍在web应用程序中。2) 我注意到,您没有在startup.cs中添加任何身份服务,这些服务在您使用单个用户帐户创建空web应用时存在:services.AddIdentity().AddEntityFrameworkStores().AddDefaultTokenProviders();在这个示例中,有很多事情是我通常不会做的。这纯粹是一个概念证明,迁移可以存在并在类库中创建。就上下文而言,不需要将任何内容连接起来。
<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>