Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET标准库是否支持EF Core添加迁移?_C#_Asp.net Core_Entity Framework Core_.net Standard - Fatal编程技术网

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

C# .NET标准库是否支持EF Core添加迁移?,c#,asp.net-core,entity-framework-core,.net-standard,C#,Asp.net Core,Entity Framework Core,.net Standard,我们一直在尝试在.Net标准1.6类库中运行EF核心迁移,但一直失败。但在.NETCore1.1类库中同样可以很好地通过 .NET标准是否支持EF迁移 当DbContext被放置在netstandardx.y类库中时,文档将这种情况视为限制 解决方法1-将应用程序用作启动项目 如果您有现有的.NET Core应用程序或.NET Framework应用程序(包括ASP.NET Core Web应用程序),则可以将其用作启动项目。如果没有,您可以创建一个新的,仅用于.NET命令行工具。 指定“可运行

我们一直在尝试在.Net标准1.6类库中运行EF核心迁移,但一直失败。但在.NETCore1.1类库中同样可以很好地通过

.NET标准是否支持EF迁移


DbContext
被放置在
netstandardx.y
类库中时,文档将这种情况视为限制

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

dotnet ef migrations list --startup-project ../MyConsoleApp/
解决方案2-跨目标可运行框架 向类库项目添加其他目标框架。这可以是.NET核心应用程序或.NET Framework的一个版本。 要使项目成为.NET核心应用程序,请将“netcoreapp1.0”框架添加到项目中,如以下示例所示: XML


netcoreapp1.0;netstandard1.4
以.NET Framework为目标时,请确保以4.5.1或更高版本为项目目标。 XML


net46;netstandard1.4

我还没有尝试使用.Net标准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 Core Package Manager控制台工具用户:

启动项目“MyNetStandardLibrary”以框架.NETStandard为目标。没有与此框架关联的运行时,无法直接执行针对它的项目。要在此项目中使用Entity Framework Core Package Manager控制台工具,请添加引用此项目的针对.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,将此项目更新为跨目标.NET Framework或.NET Core

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


显示了这些错误的原因:

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

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

简而言之,您需要将启动项目设置为具有.NET运行时的项目(本例中为.NET Core),然后确保将.NET标准项目设置为Package Manager Console>Default项目

示例CLI解决方案:

Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
非CLI解决方案:

Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
  • 右键单击项目中的.NET Core应用程序
  • 单击“设置为启动项目”
  • 打开包管理器控制台
  • 从PackageManager控制台的默认项目下拉列表中选择.NET标准项目
  • 运行CLI命令(添加迁移、dotnet ef迁移添加等)

  • @曾,谢谢!!这里有明确的指示

    编辑项目文件:

    <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>
    

    现在应该有一个自动生成的迁移文件夹。爱死它了

    好吧,但这很复杂,我想解释一下

    案例:Asp.NETCore,我有一个包含Db上下文的标准库。我想迁移 此上下文但标准库不直接接受迁移,需要启动项目

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

    Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
    
    Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
    
    我们将从PackageManager控制台下拉列表中选择Caller项目,但它将在库项目中创建迁移文件。 之后,不要从下拉列表中选择其他项目,直接从调用者项目运行update,无需任何参数

    Update-Database
    
    试试奇怪但真实的方法

    更新: 我已将我的项目Asp.net EntityFrameworkCore 3.1.3升级到3.1.4,而在上面的项目尚未正常工作,并给出了一个错误:

    项目上未安装EntityFramework包

    这个错误呢

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

    这是一个EntityFramework.Core应用程序!我还将EntityFramework安装到standart库中。但它无法理解并重新启动了V.S。 这一次,它需要将entityframework安装到starter MVC(Web)项目中。我不能那样做。我决定添加一个新的控制台应用程序来解决这个需求。并为此创建了以下应用程序

    类程序
    {
    公共类DesignTimeDbContextFactory:IDesignTimeDbContextFactory
    {
    public DomainDbContext CreateDbContext(字符串[]args)
    {
    IConfigurationRoot配置=新配置生成器()
    .AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
    .AddenEnvironmentVariables()
    //.SetBasePath(目录.GetCurrentDirectory())
    //.AddJsonFile(“appsettings.json”)
    .Build();
    var builder=new DbContextOptionsBuilder();
    var connectionString=configuration.GetConnectionString(“DefaultConnection”);
    使用SQLServer(connectionString);
    返回新的DomainDbContext(builder.Options);
    }
    }
    静态void Main(字符串[]参数)
    {
    
    dotnet ef migrations add InitialCreate
    
    Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
    
    Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
    
    Update-Database
    
    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!");
        }
    }