Подтвердить что ты не робот

Enable-Migrations Exception вызывает "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; }
  }
} 

И 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, где я написал unit test, 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>
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

Параметры:

-ProjectName

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

-StartUpProjectName

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

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

get-help enable-migrations -Full        

Ответ 4

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

В Visual Studio перейдите в Project/Manage Nuget Packages...

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

Ответ 5

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

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

Ответ 6

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

Пакеты Nuget

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

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

EntityFrameworkCore\Enable-Migrations

EntityFrameworkCore\Add-Migration Book

Ответ 7

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

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

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

  • Разгрузите проект запуска (в моем случае проект ASP.Net Core). Щелкните правой кнопкой мыши название проекта и выберите Unload Project.
  • Запустите необходимые команды миграции в консоли диспетчера пакетов
  • Щелкните правой кнопкой мыши невыгруженный проект и выберите Reload Project
  • Щелкните правой кнопкой мыши тот же проект и выберите Set as StartUp Project.

Не весело.

Ответ 8

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