2016-07-18 10 views
19

Ich habe eine Bibliothek basierend auf .NET 4.6.2 Version erstellt.
Zu der Bibliothek habe ich das EntityFramework-Paket der Version 6.1.3 hinzugefügt.
ich ein Modell erstellt, wieEnable-Migrations Ausnahme beim Aufrufen von "SetData" mit "2" Argument (en)

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

Und die

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

    } 
} 

Dann DbContext folge ich Migration zu ermöglichen versucht und hat über

PM> Enable-Migrations 

Anweisung, bekam die Fehlermeldung:

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. 

Was mache ich falsch?

aktualisieren Hier ist die Struktur, wie projet

enter image description here

In den sessiontest.cs bauen ist, schrieb ich den Test für 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(); 

} 

Das ComponentsTest Projekt, wo ich die Unit-Test geschrieben, sieht die app.config wie folgt:

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

Und in der Bibliothek (Komponente) selbst die 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

Möglicherweise ein Problem mit Ihrem Startprojekt? [Installationsfehler Enable-Migrations] (http://stackoverflow.com/questions/17308170/enable-migrations-installation-error) – Tone

+0

Ich habe meinen Beitrag aktualisiert, bitte überprüfen. Was könnte mit Startup-Projekt falsch sein? –

+0

Definieren Sie Ihre Verbindungszeichenfolge richtig? –

Antwort

21

Andere Antworten deuten darauf hin, dass dies ein Problem mit Ihrem Startprojekt ist.

Da es sich bei Ihrem Projekt um eine Bibliothek handelt, können Sie versuchen, Ihr Komponententestprojekt als Ihr Startprojekt zu definieren, wie unter this answer beschrieben.

Sie können auch versuchen, das Standardprojekt in der Package Manager-Konsole für Ihr Bibliotheksprojekt entsprechend der akzeptierten Antwort here festzulegen.

Möglicherweise treten Probleme mit der Erstellung der Migrationen auf. Wenn Sie weitere Kontrolle benötigen, gibt es in EF6 verschiedene Argumente, die Sie mit Enable-Migrations verwenden können, wie in this answer beschrieben, aber ich habe nicht genug Kenntnisse in diesem Bereich, um Sie weiter zu führen. Sie müssen vielleicht etwas lesen.

+3

Juhui es funktioniert. Ich habe Komponenten als Startprojekt festgelegt. Vielen Dank. –

10

Um von der Definition der Startprojekt explizit frei zu sein, können Sie den Befehl verwenden können:

Enable-Migrations -EnableAutomaticMigrations -ProjectName Components -StartupProjectName Components 

Die Parameter sind:

-ProjectName

Gibt das Projekt, das die eingerüstete Migrationen Konfiguration Klasse wird hinzugefügt (configuration.cs). Wenn diese Option nicht angegeben wird, wird das in der Paketmanager-Konsole ausgewählte Standardprojekt verwendet.

-StartUpProjectName

Gibt die Konfigurationsdatei für benannte Verbindungszeichenfolgen zu verwenden. Wenn diese Option nicht angegeben wird, wird die Konfigurationsdatei des angegebenen Projekts verwendet.

Um weitere Details für den Befehl zu erhalten, führen:

get-help enable-migrations -Full   
+1

kein Erfolg, immer noch der gleiche Fehler – Softlion

+0

@Softlion. Können Sie den Fehler posten, den Sie bekommen? –

+0

Mit der akzeptierten Antwort funktioniert es einwandfrei – Softlion

1

Dieser Fehler mir heute aufgetreten, nachdem ich ein altes-ish Projekt kloniert, der auf asp.net Core-Rc2 noch konfiguriert wurde ausgeführt. Nachdem ich 1.1 installiert und alle Variablen geändert hatte, blieb der Fehler bestehen. Die Lösung in meinem Fall war Neustart. Die Installation von Asp.net Core 1.1 war noch nicht abgeschlossen.

+0

Ich habe dieses Problem mit ASP.NET Core und einem vollständigen .NET-Framework, wenn die Migrationen in einem anderen Klassenbibliotheksprojekt sind. Ich werde dieses Update geben. – James

+0

@James - hast du es geschafft, das zu beheben, ich habe das gleiche Problem, aber konnte keinen Weg nach vorne finden. – Krishna

+0

Ich habe nicht viel mehr Zeit damit verbracht, das war kein Projekt für die Produktion, nur dass ich mich mit den Änderungen herumschlagen musste. Ich habe versucht, das Problem mit dem freigegebenen VS2017 neu zu erstellen und es passiert nicht mehr, alles funktioniert einfach. – James

0

Edit: Einfach fix (wie oben angegeben) -StartupProjectName YourEF6ProjectNameHere

Als ich hatte die falsche StartupProjectName benutze ich immer noch den Fehler. Das ist, wenn ich die Lösung unter Verwendung von:

Meine kludgy Work-around ist das Projekt zu entladen, die nicht EF Migrationen benötigt:

  1. Unload das Startprojekt (in meinem Fall ein ASP.Net Kernprojekt). Klicken Sie mit der rechten Maustaste auf den Projektnamen und wählen Sie Unload Project.
  2. Führen Sie die erforderlichen Migrationsbefehle in der Paket-Manager-Konsole
  3. Rechtsklick auf das unbelastete Projekt und Reload Project
  4. Rechtsklick auf das gleiche Projekt wählen und Set as StartUp Project wählen.

Nicht lustig.

3

Dies kann passieren, wenn Sie beiden Microsoft.EntityFrameworkCore.SqlServer neben einer älteren Version von EntityFramework sagen

6.x installiert haben

in Visual Studio zu Projekt gehen/Nuget Pakete verwalten ...

Nehmen Wenn Sie mehr als eine Version von EntityFramework installiert haben, deinstallieren Sie alle älteren Versionen und lassen Sie nur die neueste Version zurück.

+0

Die VS-Projektvorlage für ASP.NET Core hatte 'Microsoft.AspNetCore.All' installiert, das' Microsoft.EntityFrameworkCore.Design' enthält. Nach der Installation von EF6 habe ich den gleichen Fehler bekommen. Die Lösung bestand darin, die "All" -Version des Pakets zu entfernen und die anderen benötigten Pakete separat neu zu installieren. – Maetis

Verwandte Themen