2016-07-18 133 views
19

Ho creato una libreria basata su .NET 4.6.2 versione.
Alla libreria, ho aggiunto il pacchetto 6.1.3 di EntityFramework.
Ho creato un modello come seguireAbilita-Migrazioni Eccezione chiamata "SetData" con "2" argomento/i

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

    } 
} 

Poi ho provato a consentire la migrazione e ha fatto tramite

PM> Enable-Migrations 

dichiarazione, ha ottenuto il messaggio di errore:

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. 

Cosa faccio di sbagliato?

Aggiornamento Qui la struttura, come Projet è costruire

enter image description here

Negli sessiontest.cs, ho scritto il test per il 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(); 

} 

Il progetto ComponentsTest, dove ho scritto il test di unità, l'app.config appare come segue:

<?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 nella libreria (componente) si 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

Forse un problema con il tuo progetto di avvio? re [Errore di installazione Enable-Migrations] (http://stackoverflow.com/questions/17308170/enable-migrations-installation-error) – Tone

+0

Ho aggiornato il mio post, per favore controlla. Cosa potrebbe esserci di sbagliato nel progetto di avvio? –

+0

Definite correttamente la stringa di connessione? –

risposta

21

Altre risposte suggeriscono che questo è un problema con il tuo progetto di avvio.

Poiché il progetto è una libreria, è possibile provare a impostare il progetto di test dell'unità come progetto di avvio per this answer.

Si potrebbe anche provare a impostare il progetto predefinito nella console di Gestione pacchetti nel progetto della libreria in base alla risposta accettata here.

È possibile che si verifichino problemi relativi alla posizione in cui vengono create le migrazioni. Se hai bisogno di ulteriore controllo, in EF6 ci sono vari argomenti che puoi usare con Enable-Migrations come dettagliato in this answer ma non ho abbastanza conoscenza in quest'area per guidarti ulteriormente. Potrebbe essere necessario leggere un po '.

+3

Juhui funziona. Ho impostato i componenti come progetto di avvio. Grazie mille. –

10

di essere libero da definire in modo esplicito progetto di avvio, è possibile utilizzare il comando:

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components 

I parametri sono:

-ProjectName

Specifica il progetto che la configurazione migrazioni ponteggi la classe verrà aggiunta a (configuration.cs). Se omesso, viene utilizzato il progetto predefinito selezionato nella console del gestore pacchetti .

-StartUpProjectName

Specifica il file di configurazione da utilizzare per stringhe di connessione con nome. Se omesso, viene utilizzato il file di configurazione del progetto specificato.

Per ottenere maggiori dettagli per il comando, eseguire:

get-help enable-migrations -Full   
+1

senza successo, sempre lo stesso errore – Softlion

+0

@Softlion. Puoi pubblicare l'errore che ottieni? –

+0

Utilizzando la risposta accettata funziona bene – Softlion

1

oggi Questo errore si è verificato a me, dopo che ho clonato un progetto vecchio-ish che era ancora configurato per funzionare su asp.net Nucleo Rc2. Dopo aver installato 1.1 e modificato tutte le variabili, l'errore persisteva.

La soluzione nel mio caso era riavviare. L'installazione di Asp.net Core 1.1 non era ancora finita.

+0

Ho riscontrato questo problema con ASP.NET Core e un framework .NET completo quando le migrazioni si trovano su un altro progetto di libreria di classi. Darò questo aggiornamento. – James

+0

@James - hai risolto il problema, ho lo stesso problema ma non sono riuscito a trovare una soluzione. – Krishna

+0

Non ci ho dedicato molto tempo, non era un progetto di produzione, solo un po 'di confusione con le modifiche. Ho provato a ricreare il problema con il VS2017 rilasciato e non succede più, funziona tutto solo. – James

0

Edit: fix semplice (come indicato sopra) -StartupProjectName YourEF6ProjectNameHere

Quando avevo usato lo StartupProjectName sbagliato ho ancora ottenuto l'errore. In quel momento stavo usando la soluzione qui di seguito:

mio kludgy work-around è per scaricare il progetto che non necessita di migrazioni EF:

  1. Scaricare il progetto di avvio (nel mio caso un progetto ASP.Net core). Fare clic con il pulsante destro del mouse sul nome del progetto e selezionare Unload Project.
  2. eseguire i comandi di migrazione necessari nel Package Manager Console
  3. Fare clic con il progetto scaricato e selezionare Reload Project
  4. Fare clic con il medesimo progetto e scegliere Set as StartUp Project.

Non divertente.

3

Questo può accadere se si dispone di Microsoft.EntityFrameworkCore.SqlServer installato accanto una vecchia versione di EntityFramework dici 6.x

In Visual Studio, vai al progetto/Gestisci Pacchetti Nuget ...

Prendere uno sguardo attraverso l'elenco installato e se è installata più di una versione di EntityFramework, disinstallare tutte le versioni precedenti, lasciando solo l'ultima versione.

+0

Il modello di progetto VS per ASP.NET Core ha installato 'Microsoft.AspNetCore.All' che include' Microsoft.EntityFrameworkCore.Design'. Dopo aver installato EF6, ho ricevuto lo stesso errore. La soluzione era rimuovere la versione "tutto" del pacchetto e reinstallare gli altri pacchetti necessari separatamente. – Maetis