Excepción Enable-Migrations llamando a “SetData” con “2” argumento (s)

Creé una biblioteca basada en la versión .NET 4.6.2.
A la biblioteca, agregué el paquete EntityFramework versión 6.1.3.
Creé un modelo como sigue

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

Y el 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 Sessions { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } } } 

Luego traté de habilitar la migración y lo hice a través de

 PM> Enable-Migrations 

statement, recibió el mensaje de error:

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

¿Qué estoy haciendo mal?

Actualice Aquí la estructura, cómo se construye el proyecto

enter image description here

En sessiontest.cs, escribí la prueba 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(); } 

El proyecto ComponentsTest, donde escribí la prueba unitaria, el app.config se ve así:

       

Y en la biblioteca (componente) sí mismo la app.config:

    

Otras respuestas sugieren que este es un problema con su proyecto de inicio.

Como su proyecto es una biblioteca, puede intentar configurar su proyecto de prueba unitaria como su proyecto de inicio según esta respuesta .

También puede intentar configurar el proyecto predeterminado en la consola de Package Manager para su proyecto de biblioteca de acuerdo con la respuesta aceptada aquí .

Es posible que tenga problemas con el lugar donde se crean las migraciones. Si necesita más control, en EF6 hay varios argumentos que puede usar con Enable-Migrations como se detalla en esta respuesta, pero no tengo suficiente conocimiento en esta área para guiarlo más. Es posible que necesites leer un poco.

Para no definir explícitamente el proyecto de inicio, puede usar el comando:

 Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components 

Los parámetros son:

-Nombre del proyecto

Especifica el proyecto al que se agregará la clase de configuración de migraciones con scaffolded (configuration.cs). Si se omite, se utiliza el proyecto predeterminado seleccionado en la consola del administrador de paquetes.

-StartUpProjectName

Especifica el archivo de configuración para usar para cadenas de conexión con nombre. Si se omite, se utiliza el archivo de configuración del proyecto especificado.

Para obtener más detalles sobre el comando, ejecuta:

 get-help enable-migrations -Full 

Esto puede suceder si tiene ambos Microsoft.EntityFrameworkCore.SqlServer instalado junto con una versión anterior de EntityFramework decir 6.x

En Visual Studio, ve a Project / Manage Nuget Packages …

Eche un vistazo a través de la lista Instalado y si hay más de una versión de EntityFramework instalada, desinstale todas las versiones anteriores, dejando solo la última versión.

Actualización de 2018: si la respuesta aceptada no ayuda, consulte este problema de github en el repository de EF6. Aparentemente, los comandos de migración de código no funcionan con el nuevo formato de proyecto. Para que los comandos de migración funcionen, debe crear un proyecto de Class Library (.NET Framework) (estándar anterior), mover todos los archivos allí, agregar todas las dependencias necesarias y ejecutar el comando.

EDITAR: Acabo de encontrarme con este problema al crear un proyecto de Class Library (.NET Standard) en VisualStudio 2017 15.6.6 utilizando EntityFramework 6.2.0. Crear un proyecto “antiguo estándar” como se explicó anteriormente lo soluciona.

Este error se me ocurrió hoy, después de clonar un proyecto antiguo que todavía estaba configurado para ejecutarse en asp.net Core Rc2. Después de instalar 1.1 y cambiar todas las variables, el error persistió.

La solución en mi caso fue reiniciar . La instalación de Asp.net Core 1.1 no se terminó aún.

Editar: solución simple (como se indicó anteriormente) -StartupProjectName YourEF6ProjectNameHere

Cuando estaba usando el StartupProjectName incorrecto, sigo teniendo el error. Fue entonces cuando estaba usando la solución a continuación:

Mi kludgy work-around es descargar el proyecto que no requiere migraciones EF:

  1. Descargue el proyecto de inicio (en mi caso, un proyecto ASP.Net Core). Haga clic con el botón derecho en el nombre del proyecto y seleccione Unload Project .
  2. Ejecute los comandos de migración necesarios en la consola del Administrador de paquetes
  3. Haga clic derecho en el proyecto descargado y elija Reload Project
  4. Haga clic derecho en el mismo proyecto y elija Set as StartUp Project .

No es divertido.