c# - Exceção Enable-Migrations chamando "SetData" com argumento(s) "2"




entity-framework (6)

Criei uma biblioteca baseada na versão .NET 4.6.2.
À biblioteca, adicionei o pacote EntityFramework versão 6.1.3.
Eu criei um modelo da seguinte forma

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; }
  }
} 

E o 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>();
    }

  }
}

Tentei ativar a migração e fiz via

PM> Enable-Migrations

instrução, recebeu a mensagem de erro:

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.

O que estou fazendo de errado?

Atualizar Aqui a estrutura, como o projeto é construído

No sessiontest.cs, escrevi o teste para 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();

}

O projeto ComponentsTest, onde escrevi o teste de unidade, o app.config tem a seguinte aparência:

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

E na biblioteca (Component) em si o 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>

https://code.i-harness.com


Atualização de 2018 - se a resposta aceita não ajudar, consulte este problema do github no repositório EF6. Aparentemente, os comandos de migração de código não funcionam com o novo formato de projeto. Para que os comandos de migração funcionem, é necessário criar um projeto da Class Library (.NET Framework) (padrão antigo), mover todos os arquivos para lá, adicionar todas as dependências necessárias e executar o comando.

EDIT: Acabei de encontrar este problema criando um projeto da Class Library (.NET Standard) no VisualStudio 2017 15.6.6 usando o EntityFramework 6.2.0. Criar um projeto "antigo padrão", conforme explicado acima, corrige-o.


Editar: correção simples (conforme indicado acima) -StartupProjectName YourEF6ProjectNameHere

Quando eu estava usando o StartupProjectName errado, ainda recebia o erro. Foi quando eu estava usando a solução abaixo:

Minha solução alternativa é descarregar o projeto que não requer migrações EF:

  1. Descarregue o projeto de inicialização (no meu caso, um projeto ASP.Net Core). Clique com o botão direito do mouse no nome do projeto e selecione Unload Project .
  2. Execute os comandos de migração necessários no Console do Gerenciador de Pacotes
  3. Clique com o botão direito do mouse no projeto descarregado e escolha Reload Project
  4. Clique com o botão direito do mouse no mesmo projeto e escolha Set as StartUp Project .

Não tem graça.


Eu também tinha duas versões do EF instaladas e usando o comando "EntityFrameworkCore \ Add-Migration [migrationname]" para especificar qual versão usar resolver o problema.


Isso pode acontecer se você tiver o Microsoft.EntityFrameworkCore.SqlServer instalado junto com uma versão mais antiga do EntityFramework, por exemplo, 6.x

No Visual Studio, vá para Projetar / gerenciar pacotes Nuget ...

Dê uma olhada na lista Instalado e, se mais de uma versão do EntityFramework estiver instalada, desinstale todas as versões anteriores, deixando apenas a versão mais recente.


Para não definir explicitamente o projeto de inicialização, você pode usar o comando:

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

Os parâmetros são:

-Nome do Projeto

Especifica o projeto ao qual a classe de configuração de migrações de andaimes será adicionada (configuration.cs). Se omitido, o projeto padrão selecionado no console do gerenciador de pacotes é usado.

-StartUpProjectName

Especifica o arquivo de configuração a ser usado para cadeias de conexão nomeadas. Se omitido, o arquivo de configuração do projeto especificado é usado.

Para obter mais detalhes sobre o comando, execute:

get-help enable-migrations -Full        

se alguém estiver usando o visual studio 2017, talvez seja necessário verificar os seguintes pacotes

Pacotes Nuget

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

depois disso, execute o comando migrations abaixo no console

EntityFrameworkCore\Enable-Migrations

EntityFrameworkCore\Add-Migration Book




entity-framework