Исключение Enable-Migrations, вызывающее "SetData" с аргументом "2"

Я создал библиотеку на основе версии.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; }
  }
} 

И дбконтекст

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

В sessiontest.cs я написал тест для БД.

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

9 ответов

Решение

Другие ответы предполагают, что это проблема вашего стартапа.

Поскольку ваш проект является библиотекой, вы можете попытаться установить свой проект модульного тестирования в качестве стартового проекта согласно этому ответу.

Вы также можете попытаться установить проект по умолчанию в консоли диспетчера пакетов для своего библиотечного проекта в соответствии с принятым ответом здесь.

У вас могут возникнуть проблемы с созданием миграций. Если вам нужен дополнительный контроль, в EF6 есть различные аргументы, которые вы можете использовать с Enable-Migrations как подробно описано в этом ответе, но у меня недостаточно знаний в этой области, чтобы вести вас дальше. Возможно, вам придется немного почитать.

Обновление 2018 года - если принятый ответ не поможет, см. Эту проблему в github в репозитории EF6. Очевидно команды переноса кода не работают с новым форматом проекта. Чтобы команды миграции работали, вам нужно создать Class Library (.NET Framework) Project (старый стандарт), переместите все файлы туда, добавьте все необходимые зависимости и выполните команду.

РЕДАКТИРОВАТЬ: я только столкнулся с этой проблемой, создав Class Library (.NET Standard) проект на VisualStudio 2017 15.6.6 с использованием EntityFramework 6.2.0. Создание "старого стандартного" проекта, как описано выше, исправляет это.

Чтобы освободить от явного определения запуска проекта, вы можете использовать команду:

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

Параметры:

-Название проекта

Определяет проект, в который будет добавлен класс конфигурации миграции леса (configuration.cs). Если опущен, используется проект по умолчанию, выбранный в консоли диспетчера пакетов.

-StartUpProjectName

Указывает файл конфигурации для использования для именованных строк подключения. Если опущен, используется файл конфигурации указанного проекта.

Чтобы получить более подробную информацию о команде, выполните:

get-help enable-migrations -Full        

Это может произойти, если у вас установлен Microsoft.EntityFrameworkCore.SqlServer вместе со старой версией EntityFramework, скажем 6.x

В Visual Studio перейдите в раздел Проект / Управление пакетами Nuget...

Просмотрите список установленных и, если установлено более одной версии EntityFramework, удалите все старые версии, оставив только последнюю версию.

Изменить: Простое исправление (как указано выше) -StartupProjectName YourEF6ProjectNameHere

Когда я использовал неправильное имя StartupProjectName, я все еще получил ошибку. Вот когда я использовал решение ниже:

Мой обходной путь - выгрузить проект, который не требует миграции EF:

  1. Выгрузите стартовый проект (в моем случае это проект ASP.Net Core). Щелкните правой кнопкой мыши имя проекта и выберите Unload Project,
  2. Запустите необходимые команды миграции в консоли диспетчера пакетов.
  3. Щелкните правой кнопкой мыши на незагруженном проекте и выберите Reload Project
  4. Щелкните правой кнопкой мыши по тому же проекту и выберите Set as StartUp Project,

Не смешно.

У меня также были установлены 2 версии EF, и я использовал команду "EntityFrameworkCore\Add-Migration [migrationname]", чтобы указать, какую версию использовать, чтобы решить проблему.

Если кто-то использует Visual Studio 2017, возможно, вам придется проверить следующие пакеты

Пакеты Nuget

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

после этого запустите команду миграции ниже на консоли

EntityFrameworkCore\Enable-Migrations

EntityFrameworkCore\Add-Migration Book

Эта ошибка произошла со мной сегодня, после того, как я клонировал старый устаревший проект, который все еще был настроен для работы на asp.net Core Rc2. После того, как я установил 1.1 и изменил все переменные, ошибка не исчезла.

Решением в моем случае была перезагрузка. Установка Asp.net Core 1.1 еще не была завершена.

бежать:

"EntityFramework6\Enable-Migrations"

для Entity Framework 6.NB: используйте версию установленного пакета.

Начинайте последующие команды с: *EntityFramework6*

где EntityFramework — это пакет, в котором есть библиотеки для выполнения нашей команды.

Другие вопросы по тегам