【问题标题】:Enable-Migrations Exception calling "SetData" with "2" argument(s)使用“2”参数调用“SetData”的启用迁移异常
【发布时间】:2016-07-18 12:04:06
【问题描述】:

我创建了一个基于 .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.

我做错了什么?

更新 这里是结构,项目是如何构建的

在 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>

在库(组件)本身中,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>

【问题讨论】:

  • 您的启动项目可能有问题?回复Enable-Migrations installation error
  • 我更新了我的帖子,请检查。启动项目可能有什么问题?
  • 你的连接字符串定义正确吗?
  • 我更新了帖子,请查收。

标签: c# entity-framework


【解决方案1】:

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

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

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

您可能会遇到创建迁移的位置的问题。如果您需要进一步控制,在 EF6 中,您可以将各种参数与Enable-Migrations 一起使用,如this answer 中所述,但我在这方面没有足够的知识来指导您进一步。你可能需要做一些阅读。

【讨论】:

  • 聚辉它有效。我将组件设置为启动项目。非常感谢。
【解决方案2】:

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

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

【讨论】:

  • 我在使用新的 SDK 格式时遇到了同样的问题。将 Entity Framework 升级到 6.4 版就足够了(我认为任何 6.3+ 都可以使用)。
  • 我昨晚遇到了这个问题。我的 DataAccess 项目 (Visual Studio 2019)t 已创建为标准而不是类库的 .net 框架类型。
【解决方案3】:

为了免于显式定义启动项目,可以使用命令:

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

参数为:

-项目名称

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

-StartUpProjectName

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

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

get-help enable-migrations -Full        

【讨论】:

    【解决方案4】:

    如果您同时安装了 Microsoft.EntityFrameworkCore.SqlServer 和旧版本的 EntityFramework (例如 6.x),则可能会发生这种情况

    在 Visual Studio 中,转到项目/管理 Nuget 包...

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

    【讨论】:

    • ASP.NET Core 的 VS 项目模板已安装 Microsoft.AspNetCore.All,其中包括 Microsoft.EntityFrameworkCore.Design。安装 EF6 后,我得到了同样的错误。解决方案是删除包的“全部”版本并单独重新安装其他需要的包。
    【解决方案5】:

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

    我的解决方案是重启。 Asp.net Core 1.1 的安装还没有完成。

    【讨论】:

    • 当迁移在另一个类库项目上时,我遇到了 ASP.NET Core 和完整的 .NET 框架的问题。我会试试这个更新。
    • @James - 你能解决这个问题吗,我有同样的问题,但找不到前进的方向。
    • 我没有花太多时间在它上面,这不是一个生产项目,只是我在搞乱变化。我确实尝试使用已发布的 VS2017 重新创建问题,但它不再发生,一切正常。
    【解决方案6】:

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

    当我使用错误的 StartupProjectName 时,我仍然收到错误消息。那是我使用以下解决方案的时候:

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

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

    不好玩。

    【讨论】:

      【解决方案7】:

      如果有人在使用 Visual Studio 2017,那么您可能需要检查以下软件包

      Nuget 包

      Microsoft.EntityFrameworkCore
      
      Microsoft.EntityFrameworkCore.Tools
      
      Microsoft.EntityFrameworkCore.SqlServer
      

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

      EntityFrameworkCore\Enable-Migrations
      
      EntityFrameworkCore\Add-Migration Book
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-13
          • 1970-01-01
          • 1970-01-01
          • 2016-10-18
          • 2019-02-18
          • 1970-01-01
          相关资源
          最近更新 更多