Enable-Migrations使用“2”参数调用“SetData”的exception

我创建了一个基于.NET 4.6.2版本的库。
在库中,我添加了EntityFramework版本6.1.3包。
我创建了一个模型如下

using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Components.Models { public class Session { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public string Id { get; set; } [Key] [Required] public string Identity { get; set; } [Required] public DateTime CreatedAt { get; set; } [Required] public DateTime UpdatedAt { get; set; } } } 

和dbcontext

 using System.Configuration; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using Components.Models; namespace Components.DataContexts { public class SessionContext : DbContext { public SessionContext() : base(ConfigurationManager.ConnectionStrings["sessiondb"].ConnectionString) { } public DbSet Sessions { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } } } 

然后我尝试启用迁移并通过

 PM> Enable-Migrations 

声明,得到错误信息:

 Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable."At D:\C#\IndustryCloud\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1:720 char:5 + $domain.SetData('startUpProject', $startUpProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SerializationException System.NullReferenceException: Object reference not set to an instance of an object. at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetProjectTypes(Project project, Int32 shellVersion) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.IsWebProject(Project project) at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory) at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName) at System.Data.Entity.Migrations.EnableMigrationsCommand.c__DisplayClass2.b__0() at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) Object reference not set to an instance of an object. 

我做错了什么?

更新结构,如何构建projet

在此处输入图像描述

在sessiontest.cs中,我为db编写了测试。

 [Test] public void InsertARow_DbInitial_ExpectDbValue() { var sn = new Session() { Identity = Random.Generate(15), CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; db.Sessions.Add(sn); db.SaveChanges(); } 

在我编写unit testing的ComponentsTest项目中,app.config看起来如下:

       

在库(Component)本身app.config:

    

其他答案表明这是您的启动项目的问题。

由于您的项目是库,您可以尝试根据此答案将unit testing项目设置为启动项目。

您还可以尝试根据此处接受的答案将Package Manager Console中的默认项目设置为库项目。

您可能会遇到创建迁移的问题。 如果您需要进一步控制,在EF6中,您可以使用Enable-Migrations各种参数,如本答案中所详述,但我没有足够的知识来指导您进一步指导您。 你可能需要做一些阅读。

要明确定义启动项目,可以使用以下命令:

 Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components 

参数是:

-项目名

指定将添加脚手架迁移配置类的项目(configuration.cs)。 如果省略,则使用在包管理器控制台中选择的默认项目。

-StartUpProjectName

指定用于命名连接字符串的配置文件。 如果省略,则使用指定项目的配置文件。

要获取该命令的更多详细信息,请运行:

 get-help enable-migrations -Full 

如果您同时安装了Microsoft.EntityFrameworkCore.SqlServer以及旧版本的EntityFramework,则会发生这种情况。

在Visual Studio中,转到Project / Manage Nuget Packages …

查看已安装列表,如果安装了多个版本的EntityFramework,请卸载所有旧版本,只保留最新版本。

2018更新 – 如果接受的答案没有帮助,请在EF6存储库中查看此github问题 。 显然,代码迁移命令不适用于新的项目格式。 为了使迁移命令起作用,您需要创建一个Class Library (.NET Framework)项目(旧标准),将所有文件移动到那里,添加所有必需的依赖项并运行命令。

编辑:我刚刚通过使用EntityFramework 6.2.0在VisualStudio 2017 15.6.6上创建Class Library (.NET Standard)项目遇到了这个问题。 如上所述创建“旧标准”项目可以解决这个问题。

在克隆了一个仍然配置为在asp.net Core Rc2上运行的旧项目后,今天发生了这个错误。 在我安装1.1并更改了所有变量后,错误仍然存​​在。

在我的情况下解决方案是重新启动 。 Asp.net Core 1.1的安装尚未完成。

编辑:简单修复(如上所述) -StartupProjectName YourEF6ProjectNameHere

当我使用错误的StartupProjectName时,我仍然遇到错误。 那时我正在使用下面的解决方案:

我的kludgy解决方法是卸载不需要EF迁移的项目:

  1. 卸载启动项目(在我的情况下是ASP.Net Core项目)。 右键单击项目名称,然后选择“ Unload Project
  2. 在程序包管理器控制台中运行所需的迁移命令
  3. 右键单击卸载的项目,然后选择“ Reload Project
  4. 右键单击同一项目,然后选择“ Set as StartUp Project

不好玩。