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

时间:2016-07-18 12:04:07

标签: c# entity-framework

我创建了一个基于.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<Session> Sessions { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
    }

  }
}

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

执行
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.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Object reference not set to an instance of an object.

我做错了什么?

更新 在这里结构,如何构建projet

enter image description here

在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();

}

在我编写单元测试的ComponentsTest项目中,app.config看起来如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" />
  </connectionStrings>
</configuration>

在库(Component)本身app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

  <connectionStrings>
    <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" />
  </connectionStrings>

</configuration>

8 个答案:

答案 0 :(得分:38)

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

由于您的项目是库,您可以尝试将单元测试项目设置为this answer的启动项目。

您还可以尝试按照接受的答案here将软件包管理器控制台中的默认项目设置为您的库项目。

您可能会遇到创建迁移的问题。如果您需要进一步控制,在EF6中可以使用Enable-Migrations中的 url: theme.child_theme_uri+'/searcher.php', type: 'GET', data: {"t":t, "l":l, "c":c, "w":w} , 详细说明的各种参数,但我对此领域的知识不足以指导您进一步指导。你可能需要做一些阅读。

答案 1 :(得分:13)

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

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

参数是:

-ProjectName

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

-StartUpProjectName

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

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

get-help enable-migrations -Full        

答案 2 :(得分:12)

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

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

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:1)

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

我的解决方案是重启。 Asp.net Core 1.1的安装尚未完成。

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

我还安装了2个版本的EF,并使用“ EntityFrameworkCore \ Add-Migration [migrationname]”命令指定要使用哪个版本解决了该问题。

答案 7 :(得分:0)

如果有人使用Visual Studio 2017,则可能必须检查以下软件包

Nuget软件包

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

之后,在控制台上运行下面的迁移命令

EntityFrameworkCore\Enable-Migrations

EntityFrameworkCore\Add-Migration Book