EF迁移:参数'frameworkName'不能为空字符串。

8
我正在跟随Pluralsight上的一些教程,学习如何使用.netcore设置我的第一个Web API。在尝试运行我的第一个迁移时遇到了问题: PM> Add-Migration InitialMigration Exception calling ".ctor" with "1" argument(s): "The parameter 'frameworkName' cannot be an empty string. Parameter name: frameworkName" 我理解它是在说某个构造函数有一个空参数;然而,我不知道这个“frameworkName”参数在哪里。我假设它是一些内部EF机制。
这是我的简单实体设置。 这个错误信息引用的是哪个类?
public class ShackupContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public ShackupContext(DbContextOptions<ShackupContext> options):base(options)
    {

    }
}  


    public class Post
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required]
    [MaxLength(200)]
    public string Name { get; set; }
}  

更新1 我已经按照@ViktorsTelle的建议更新了我的dbcontext,调用了基类构造函数。

我的项目与我遵循的任何教程都不同。主要区别在于我的实体包含在它们自己的项目中,而不是在api项目本身中。
enter image description here
这让我相信,在Shackup.Data项目本身上运行Add-Migration不需要我在api项目中注册我的dbcontext。我还是这样做了,想看看会发生什么:

 public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddDbContext<ShackupContext>(o => 
        o.UseNpgsql(Configuration["connectionStrings:postgres"],
        a => a.MigrationsAssembly("Shackup.Data")));
    }  

一旦我这样做了,我就在迁移过程中进展了一点。现在我正在进行以下操作:
PM> Add-Migration InitialMigration 指定的 deps.json [C:\Users\campo\Documents\Visual Studio 2015\Projects\Shackup\src\Shackup.Api\bin\Debug\netcoreapp1.1\Shackup.Api.deps.json] 不存在 进程以非零退出代码结束 所以我查看了该目录,确实缺少该文件;但是,该文件被输出到该目录的子文件夹中。

enter image description here

deps.json文件位于win10-x64文件夹内。我可以简单地复制并粘贴到所需的文件夹中,但现在我面临一个新问题:
为什么Nuget包管理器控制台在错误的目录中查找?
或者可能是:我如何更改它以查找正确的位置?
更新2
我已经更新了两个项目中的所有项目依赖项。以下是数据和API项目的两个文件。
API
{
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.EntityFrameworkCore": "1.1.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
"Microsoft.Extensions.Configuration.Json": "1.1.0",
"Microsoft.Extensions.Logging": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.Extensions.Logging.Debug": "1.1.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
"Microsoft.NETCore.App": "1.1.0",
"Shackup.Data": "1.0.0-*",
"Npgsql.EntityFrameworkCore.PostgreSQL": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final"
},

"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final",
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
},

"frameworks": {
"netcoreapp1.1": {
  "imports": [
    "dotnet5.6",
    "portable-net45+win8"
  ]
}
},

"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},

"runtimeOptions": {
"configProperties": {
  "System.GC.Server": true
}
},
"runtimes": {
"win10-x64": {},
"win81-x64": {}
},

"publishOptions": {
"include": [
  "wwwroot",
  "**/*.cshtml",
  "appsettings.json",
  "web.config"
]
},

"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}  

数据

{
"version": "1.0.0-*",

"dependencies": {
"Microsoft.EntityFrameworkCore": "1.1.0",
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",
"NETStandard.Library": "1.6.1"
},

 "frameworks": {
"netstandard1.6": {
  "imports": "dnxcore50"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
}
}

你使用的是哪个版本的Visual Studio和特别是NuGet?您需要使用VS 2015 Update 3和NuGet v3.5才能使用.NET Core EF命令。 - Andrés Robinet
是的,而且我针对的项目不重要,命令的结果都是一样的。 - Adrian
1
针对您最后的编辑,您需要 Npgsql.EntityFrameworkCore.PostgreSQL.Design 吗? - Andrés Robinet
@ViktorsTelle 是的,我创建项目时没有那个。然后当我尝试构建时,会出现错误,指出我的 project.json 中没有“runtimes”。我可以把所有这些问题归咎于我创建这个项目时犯的错误。这些错误包括重命名项目、错误地创建 .netfull 项目、删除此类项目并重新创建新的项目。我知道我可以从头开始完全重新开始,因为我还没有进行得太深,但我正在努力坚持下去,以尽可能多地学习。 - Adrian
1
并且...将“imports”部分更改为依赖于“dnxcore50”,而不是“dotnet5.6”。 - Andrés Robinet
显示剩余14条评论
3个回答

21

在解决方案中选择正确的启动项目:在解决方案浏览器中右键单击项目,选择“设置为启动项目”


4
选择包含实体的项目作为启动项目(在解决方案资源管理器中右键单击您的项目,然后选择“设置为启动项目”),并确保您已安装 Microsoft.EntityFrameworkCore.Design 包。也许这不是最好的解决方案,但解决了我的同样问题。

1
在我的情况下,全新的.Net Core 2.2 MVC应用程序,通过选择启动对象解决了问题:
  1. 右键单击您的应用程序
  2. 选择“属性”
  3. 在“应用程序”选项卡中,“启动对象”下拉列表的值为“(未设置)”。选择(唯一可用的)另一个项目“MyAppName.Program”对我起了作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接