繁体   English   中英

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

[英]System.IO.FileNotFoundException when creating EF migrations on .net 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,Culture=neutral,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>();

}

EF Core 的设计时间分辨率很大程度上依赖于命名约定和将您的配置放在正确的位置。 您的Program class 看起来不错。

您能否检查您的 Startup class 是否与此类似,并且在ConfigureServices方法中具有所需的AddDbContext调用?

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")));
    }
}

尝试;

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

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

迁移命令。

添加迁移 MyMig -Context MyDbContext

如果未安装,则在“myproject-api”层上安装“Microsoft.EntityFrameworkCore.SqlServer”package。

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

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目录--output-dir

您可以按照本教程重试: https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/ 我无法重现您的错误。

如果您在迁移前已将项目标记为启动项目,但仍然存在问题; 这是 .NET 核心 class 库的问题。 您应该将以下内容添加到您的.csproj文件中:

<PropertyGroup>
  <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> 
</PropertyGroup>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM