是否从.NET标准库支持EF Core添加迁移?

时间:2017-06-08 08:50:11

标签: c# asp.net-core entity-framework-core .net-standard

我们一直在尝试在.Net Standard 1.6类库中运行EF Core Migration,但它一直在失败。但是.Net Core 1.1类库中的传递非常好。

  

.NET STANDARD是否支持EF Migration?

7 个答案:

答案 0 :(得分:21)

DbContext放置在netstandardx.y类库中时,文档将此案例视为know issue /限制。

  

解决方法1 - 使用应用作为启动项目

     

如果您有现有的.NET核心应用程序或.NET Framework应用程序(包括ASP.NET核心Web应用程序),则可以将其用作启动项目。如果没有,您可以创建一个新的仅用于.NET命令行工具。   指定一个“可运行的应用程序”的启动项目。   示例:console

dotnet ef migrations list --startup-project ../MyConsoleApp/
     

解决方法2 - 跨目标可运行框架

     

向类库项目添加其他目标框架。这可以是.NET Core App或.NET Framework的一个版本。   要使项目成为.NET Core App,请将“netcoreapp1.0”框架添加到项目中,如下例所示:   XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>
     

以.NET Framework为目标时,请确保将项目目标设为4.5.1或更高版本。   XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net46;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>

答案 1 :(得分:10)

对于看到以下错误的EF Core Package Manager控制台工具用户:

  

启动项目'MyNetStandardLibrary'以框架'.NETStandard'为目标。没有与此框架关联的运行时,并且无法直接执行以其为目标的项目。要将Entity Framework核心软件包管理器控制台工具与此项目一起使用,请添加一个针对引用此项目的.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,更新此项目以跨目标.NET Framework或.NET Core。

OR

  

您的目标项目“MyNetCoreApp”与您的迁移程序集“MyNetStandardLibrary”不匹配。更改目标项目或更改迁移程序集。

documentation揭示了导致这些错误的原因:

  

目标项目是添加任何文件的位置(或在某些情况下删除)。目标项目默认为在Package Manager Console中选择的Default项目,但也可以使用-Project参数指定。

     

启动项目是在执行项目代码时由工具模拟的项目。它在解决方案资源管理器中默认为一个Set为StartUp Project。它也可以使用-StartupProject参数指定。

简而言之,您需要将StartUp项目设置为具有.NET运行时(在本例中为.NET Core)的项目,然后确保将.NET Standard项目设置为程序包管理器控制台&gt;默认项目。

示例CLI解决方案:

Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp

非CLI解决方案:

  1. 右键单击项目中的.NET Core应用程序
  2. 单击“设为启动项目”
  3. 打开程序包管理器控制台
  4. 从程序包管理器控制台的“默认项目”下拉列表中选择您的.NET Standard项目
  5. 运行CLI命令(Add-Migration,dotnet ef migrations add等)

答案 2 :(得分:4)

没关系,但是很复杂,我想解释一下。

案例:Asp.Net核心,我有一个包含Db-Context的标准库。我想迁移 在这种情况下,但是标准库不直接接受迁移,需要启动项目。

解决方案:启动项目能够间接创建迁移

Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole

Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole

我们将从Package Manager Console DropDown中选择Caller Project,但它将在库项目中创建迁移文件。 之后,不要从下拉菜单中选择其他项目,而直接从调用者项目中运行不带任何参数

Update-Database

尝试奇怪但真实的

更新: 我已经将我的项目Asp.net EntityFrameworkCore 3.1.3升级到了3.1.4,而那些未成功运行的项目却给出了错误消息:

未在项目上安装EntityFramework软件包

和这个错误

无法创建“ DomainDbContext”类型的对象。为了 在设计时支持不同的模式

这是EntityFramework.Core应用程序!我也已将EntityFramework安装到标准库中。但它无法理解并重新启动V.S. 这次需要将实体框架安装到启动程序MVC(Web)项目中。我做不到我决定添加一个新的控制台应用程序来解决此要求。并为此创建了以下应用程序

install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Json
Install-Package Microsoft.Extensions.Configuration.CommandLine
Install-Package Microsoft.Extensions.Configuration.EnvironmentVariables
class Program
{
    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<DomainDbContext>
    {
        public DomainDbContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                //.SetBasePath(Directory.GetCurrentDirectory())
                //.AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<DomainDbContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseSqlServer(connectionString);
            return new DomainDbContext(builder.Options);
        }
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

这一次它正常工作了!再次使用上述命令:)欢呼

答案 3 :(得分:2)

我还没有尝试使用.Net Standard 1.6,但它确实适用于2.0。

Microsoft.EntityFrameworkCore.Tools.DotNet需要添加到其中包含DbContext的每个类库中。右键单击该项目,然后选择Edit *.csproj。然后,添加以下内容:

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
  </ItemGroup>

您可以在此处查看更深入的教程:EF 7 Migrations with multiple DBContexts

答案 4 :(得分:1)

@Tseng,谢谢!这是明确的说明。

编辑项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>
</Project>

然后添加设计工厂:

 public class DesignTimeActivitiesDbContextFactory : IDesignTimeDbContextFactory<ActivitiesDbContext>
    {
        public ActivitiesDbContext CreateDbContext(string[] args)
        {
            DbContextOptionsBuilder<ActivitiesDbContext> builder = new DbContextOptionsBuilder<ActivitiesDbContext>();

            var context = new ActivitiesDbContext(
                builder
                .UseSqlServer("Data Source=(local);Initial Catalog=Activities;Integrated Security=False;User ID=user;Password=pw;Connect Timeout=30;Encrypt=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;")
                .Options);

            return context;
        }
    }

然后构建。

然后打开命令提示符,导航到您的项目文件夹,然后运行:

dotnet ef migrations add InitialCreate

现在应该有一个自动生成的迁移文件夹。喜欢它!

答案 5 :(得分:0)

对微软可耻。

我将我的dbcontext转移到了我的dotnet核心解决方案中的控制台应用程序中。

我的解决方案中有5个项目。

然后我运行dotnet ef migrations add CreateDatabase

我使用vs代码和dotnet cli。

答案 6 :(得分:-1)

我通过针对代码使用包管理控制台,并自动迁移了Xamarin(.net stadard 2.0项目)来完成这项工作。...

https://github.com/ngrumbine/EFDemo

获取代码...