在.net核心上创建EF迁移时出现System.IO.FileNotFoundException

时间:2019-10-18 23:09:06

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

我有一个.NET Core 2.2项目,正在尝试设置EF迁移。

运行时:

  

dotnet ef迁移添加了init --verbose

我收到以下错误:

  

查找提供商的设计时服务   'Microsoft.EntityFrameworkCore.SqlServer'...使用设计时   提供程序“ Microsoft.EntityFrameworkCore.SqlServer”提供的服务。   查找程序集“ myproject-api”引用的设计时服务。没有   找到了参考设计时服务。寻找   程序集“ myproject-api”中的IDesignTimeServices实现...否   找到设计时服务。 System.IO.FileNotFoundException:   无法加载文件或程序集“ myproject,文化=中性,   PublicKeyToken = null”。系统找不到指定的文件。

这是我的csproj文件:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.4" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.4" />
  </ItemGroup>

</Project>

编辑,这是我的Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
            .UseKestrel()
            .UseUrls("http://localhost:5004")
            .UseStartup<Startup>();

}

3 个答案:

答案 0 :(得分:4)

尝试;

将上下文名称添加到选项构造函数。

 public MyDbContext(DbContextOptions<**MyDbContext**> options)
      : base(options)
    {
    }

迁移命令。

  

添加迁移MyMig -Context MyDbContext

并在“ myproject-api”层上安装“ Microsoft.EntityFrameworkCore.SqlServer”包(如果未安装)。

答案 1 :(得分:2)

EF Core的设计时间分辨率在很大程度上取决于命名约定以及将配置放置在正确的位置。您的Program类看上去不错。

您可以检查您的Startup类是否与此类似,并且在AddDbContext方法中是否具有必需的ConfigureServices调用吗?

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    }
}

答案 2 :(得分:2)

您需要开始配置数据库上下文

public class MyDbContext : DbContext
{
    public DbSet<MyEntity> Entities { get; set; }

    public MyDbContext (DbContextOptions<MyDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Apply configurations
    }
}

并在Startup.cs中配置sqlserver:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

正如我在评论中已经提到的,您需要运行迁移并指定上下文:

$ dotnet ef migrations add init --context MyDbContext

可选,您还可以定义启动项目--startup-project和输出目录--output-dir