53 votes

Exception d'activation des migrations lors de l'appel de "SetData" avec "2" argument(s)

J'ai créé une bibliothèque basée sur la version .NET 4.6.2.
Dans la bibliothèque, j'ai ajouté le paquet EntityFramework version 6.1.3.
J'ai créé un modèle comme suit

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

Et le contexte de base (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>();
    }

  }
}

J'ai ensuite essayé d'activer la migration et je l'ai fait via

PM> Enable-Migrations

a obtenu le message d'erreur suivant :

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.

Qu'est-ce qui ne va pas ?

Mise à jour Voici la structure, comment le projet est construit

enter image description here

Dans le fichier sessiontest.cs, j'ai écrit le test pour 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();

}

Dans le projet ComponentsTest, où j'ai écrit le test unitaire, le fichier app.config se présente comme suit :

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

Et dans la bibliothèque (Component) elle-même, l'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>

0 votes

Peut-être s'agit-il d'un problème lié à votre projet de démarrage ? re Erreur d'installation de Enable-Migrations

0 votes

J'ai mis à jour mon message, veuillez vérifier. Quel est le problème avec le projet de démarrage ?

0 votes

Avez-vous défini correctement votre chaîne de connexion ?

52voto

Tone Points 1306

D'autres réponses suggèrent qu'il s'agit d'un problème lié à votre projet de démarrage.

Comme votre projet est une bibliothèque, vous pouvez essayer de définir votre projet de test unitaire comme projet de démarrage par cette réponse .

Vous pouvez également essayer de définir le projet par défaut dans la console du gestionnaire de paquets sur votre projet de bibliothèque, conformément à la réponse acceptée. aquí .

Il se peut que vous rencontriez des problèmes liés à l'endroit où les migrations sont créées. Si vous avez besoin de plus de contrôle, dans EF6 il y a plusieurs arguments que vous pouvez utiliser avec Enable-Migrations comme indiqué dans cette réponse mais je n'ai pas assez de connaissances dans ce domaine pour vous guider davantage. Vous devrez peut-être vous documenter.

5 votes

Juhui, ça marche. J'ai défini Components comme projet de démarrage. Merci beaucoup.

22voto

Mihai Coman Points 61

Mise à jour 2018 - si la réponse acceptée ne vous aide pas, voir ce problème github sur le référentiel EF6. Apparemment, les commandes de migration de code ne fonctionnent pas avec le nouveau format de projet. Pour que les commandes de migration fonctionnent, vous devez créer un fichier Class Library (.NET Framework) (ancien standard), déplacez-y tous les fichiers, ajoutez toutes les dépendances nécessaires et exécutez la commande.

EDIT : Je viens de rencontrer ce problème en créant un fichier Class Library (.NET Standard) sur VisualStudio 2017 15.6.6 en utilisant EntityFramework 6.2.0. La création d'un projet "old standard" comme expliqué ci-dessus corrige le problème.

2 votes

J'ai eu le même problème avec le nouveau format du SDK. Il a suffi de mettre à jour Entity Framework vers la version 6.4 (je pense que toute version 6.3+ fonctionnera).

0 votes

J'ai rencontré ce problème hier soir. Mon projet DataAccess (Visual Studio 2019)t avait été créé en tant que Standard et non en tant que Class Library de type .net Framework.

0 votes

J'ai eu le même problème lors de la mise à jour de la version 6.1.x à la version 6.4, ce qui m'a aidé.

15voto

M.Hassan Points 3885

Pour ne pas avoir à définir explicitement le projet de démarrage, vous pouvez utiliser la commande :

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components

Les paramètres sont les suivants

-Nom du projet

Spécifie le projet auquel la classe de configuration des migrations échafaudées sera ajoutée (configuration.cs). S'il est omis, le projet par défaut sélectionné dans le gestionnaire de paquets est utilisé.

-Nom du projet de démarrage

Spécifie le fichier de configuration à utiliser pour les chaînes de connexion nommées. S'il est omis, le fichier de configuration du projet spécifié est utilisé.

Pour obtenir plus de détails sur la commande, exécutez :

get-help enable-migrations -Full

4voto

Simon Points 195

Cela peut se produire si Microsoft.EntityFrameworkCore.SqlServer est installé en même temps qu'une ancienne version d'EntityFramework, par exemple 6.x.

Dans Visual Studio, allez dans Projet/Gestion des paquets Nuget...

Jetez un coup d'œil à la liste Installed et si plusieurs versions d'EntityFramework sont installées, désinstallez toutes les anciennes versions pour ne conserver que la dernière.

1 votes

Le modèle de projet VS pour ASP.NET Core a été installé. Microsoft.AspNetCore.All qui comprend Microsoft.EntityFrameworkCore.Design . Après avoir installé EF6, j'ai obtenu la même erreur. La solution a été de supprimer la version "all" du paquet et de réinstaller les autres paquets nécessaires séparément.

1voto

Marco Points 12037

Cette erreur m'est arrivée aujourd'hui, après avoir cloné un vieux projet qui était encore configuré pour fonctionner avec asp.net Core Rc2. Après avoir installé la version 1.1 et modifié toutes les variables, l'erreur a persisté.

Dans mon cas, la solution a consisté à redémarrage . L'installation d'Asp.net Core 1.1 n'était pas encore terminée.

0 votes

J'ai ce problème avec ASP.NET Core et un framework .NET complet lorsque les migrations se font sur un autre projet de bibliothèque de classes. Je vais essayer cette mise à jour.

0 votes

@James - avez-vous réussi à résoudre ce problème, j'ai le même problème mais je n'ai pas trouvé de solution.

0 votes

Je n'ai pas passé beaucoup plus de temps dessus, ce n'était pas un projet pour la production, je me suis contenté de faire des modifications. J'ai essayé de recréer le problème avec la version VS2017 et cela ne se produit plus, tout fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X