2016-08-01 30 views
2

Ich mache ein Projekt in ASP.NET CORE 1.0.0 und ich verwende EntityFrameworkCore. Ich habe getrennten Baugruppen und meine Projektstruktur sieht wie folgt aus:Hinzufügen von Migration mit anderen Assembly

ProjectSolution 
    -src 
     -1 Domain 
     -Project.Data 
     -2 Api 
     -Project.Api 

In meinem Project.Api ist die Startup Klasse

public void ConfigureServices(IServiceCollection services) 
    {    
     services.AddDbContext<ProjectDbContext>(); 

     services.AddIdentity<IdentityUser, IdentityRole>() 
       .AddEntityFrameworkStores<ProjectDbContext>() 
       .AddDefaultTokenProviders(); 
    } 

Die DbContext in meinem Project.Data Projekt ist

public class ProjectDbContext : IdentityDbContext<IdentityUser> 
{ 
    public ProjectDbContext(DbContextOptions<ProjectDbContext> options) : base(options) 
    { 

    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 

     var builder = new ConfigurationBuilder(); 
     builder.SetBasePath(Directory.GetCurrentDirectory()); 
     builder.AddJsonFile("appsettings.json"); 
     IConfiguration Configuration = builder.Build(); 

     optionsBuilder.UseSqlServer(
      Configuration.GetConnectionString("DefaultConnection")); 
     base.OnConfiguring(optionsBuilder); 
    } 
} 

Wenn Ich versuche, die anfängliche Migration zu machen, bekomme ich diesen Fehler:

"Your target project 'Project.Api' doesn't match your migrations assembly 'Project.Data'. Either change your target project or change your migrations assembly. Change your migrations assembly by using DbContextOptionsBuilder. E.g. options.UseSqlServer(connection, b => b.MigrationsAssembly("Project.Api")). By default, the migrations assembly is the assembly containing the DbContext. Change your target project to the migrations project by using the Package Manager Console's Default project drop-down list, or by executing "dotnet ef" from the directory containing the migrations project."

Nachdem ich diesen Fehler zu sehen, habe ich versucht, diesen Befehl in Project.Api befindet auszuführen:

dotnet ef --startup-project ../Project.Api --assembly "../../1 Data/Project.Data" migrations add Initial

und ich habe diesen Fehler:

"Unexpected value '../../1 Domain/Project.Data' for option 'assembly'"

I don t know why I get this error, when I try to execute the command with the -assembly` Parameter.

Ich kann keine erste Migration von anderen Assembly erstellen und ich habe nach Informationen darüber gesucht, aber keine Ergebnisse erhalten.

Hat jemand ähnliche Probleme?

+0

Haben Sie die Dokumentation gelesen? https://docs.efproject.net/en/latest/miscellaneous/cli/dotnet.html?highlight=workaround#targeting-class-library-projects-is-not-supported – Tseng

+0

Ja, aber ich habe das nicht behoben Fehler, ich habe verschiedene Optionen von Befehlen mit --startup-project und --assed versucht, aber ich habe nichts bekommen – kdar

+0

Nicht benutzen --assembly. Das ist ein internes Implementierungsdetail, das in der Hilfe-Nachricht versteckt sein sollte, aber trotzdem auftaucht wegen https://github.com/aspnet/EntityFramework/issues/5188 – natemcmaster

Antwort

7

Alle EF-Befehle haben this check:

if (targetAssembly != migrationsAssembly) 
     throw MigrationsAssemblyMismatchError; 

targetAssembly = das Zielprojekt Sie arbeiten auf. In der Befehlszeile ist es das Projekt im aktuellen Arbeitsverzeichnis. In der Package Manager-Konsole ist dies das Projekt, das in der Dropdown-Liste oben rechts in diesem Fenster ausgewählt ist.

migrationsAssembly = Assembly mit Code für Migrationen. Dies ist konfigurierbar. Standardmäßig ist dies die Assembly, die den DbContext enthält, in Ihrem Fall Project.Data.dll. Wie die Fehlermeldung anzeigt, haben Sie zwei Möglichkeiten, um dieses Problem zu lösen.

1 - Zielbaugruppe wechseln.

cd Project.Data/ 
dotnet ef --startup-project ../Project.Api/ migrations add Initial 

// code doesn't use .MigrationsAssembly...just rely on the default 
options.UseSqlServer(connection) 

2 - Ändern Sie die Migrationsgruppe.

cd Project.Api/ 
dotnet ef migrations add Initial 

// change the default migrations assembly 
options.UseSqlServer(connection, b => b.MigrationsAssembly("Project.Api")) 
+0

Ich kann keinen Befehl von Project.Data ausführen, weil das ist eine classlibrary und es nicht ausführen Befehl, ich kann nur ausführen Befehl in Project.Api – kdar

+0

Danke, es war sehr nützlich;) –

2

Ich lief auf das gleiche Problem und fand this

Wir versuchen Sie Ihre Migrationen auf einer Klassenbibliothek laufen? Das war ich auch. Es stellt sich heraus, dass dies noch nicht unterstützt wird, also müssen wir es umgehen.

EDIT: Ich fand Lösung auf this git repo

+0

Vielen Dank. Ich sah diese Lösung, aber es schien ein wenig erzwungen, aber bis jetzt ist es die einzige Lösung, die ich gesehen habe, dass es funktioniert. Ich werde dem Link folgen, um die Nachrichten zu bekommen – kdar

+0

Vielen Dank !! services.AddDbContext (Optionen => Optionen.UseSqlServer (Konfiguration.GetConnectionString ("DefaultConnection"), x => x.MigrationsAssembly ("ClasslibraryGoesHere"))); – NetProvoke

0

Derzeit denke ich EF unterstützt nur Migrationen auf Projekten hinzuzufügen noch nicht auf Klassenbibliotheken.

Und side note für jemand anderes, der will, Migrationen zu bestimmten Ordner in Ihrem Projekt hinzuzufügen:

EF CLI dies noch nicht unterstützen. Ich habe versucht --data-dir, aber es hat nicht funktioniert.

Das einzige, was funktioniert, ist Package Manager-Konsole zu verwenden:

  1. Wählen Sie Ihre Standardprojekt
  2. Verwendung -OutputDir Befehlsparameter, .eg, Add-Migration InitConfigurationStore -OutputDir PersistedStores/ConfigurationStore Befehl gibt die mgiration in den Ordner 'PersistedStores/ConfigurationStore' in meinem Projekt.

Updates ab 10/12/2017

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    string dbConnectionString = services.GetConnectionString("YOUR_PROJECT_CONNECTION"); 
    string assemblyName = typeof(ProjectDbContext).Namespace; 

    services.AddDbContext<ProjectDbContext>(options => 
     options.UseSqlServer(dbConnectionString, 
      optionsBuilder => 
       optionsBuilder.MigrationsAssembly(assemblyName) 
     ) 
    ); 

    ... 
} 
1

hatte ich das gleiche Problem, bis ich, dass auf der Paket-Manager-Konsole oberen Leiste bemerkt => "Default Projects" sollte „Projekt sein. Daten "und nicht" Project.API ".

Sobald Sie die "Project.Data" aus der Dropdown-Liste und die Migration ausführen, sollten Sie in Ordnung sein.

+0

danke für die Rechtschreibung bearbeiten Graham. :) –