web-dev-qa-db-de.com

Fügen Sie die Migration mit einer anderen Assembly hinzu

Ich mache ein Projekt in ASP.NET CORE 1.0.0 und verwende EntityFrameworkCore. Ich habe separate Baugruppen und meine Projektstruktur sieht folgendermaßen aus:

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 Variable DbContext befindet sich in meinem Project.Data-Projekt

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 erste Migration durchzuführen, erhalte ich folgende Fehlermeldung:

"Ihr Zielprojekt 'Project.Api' stimmt nicht mit Ihren Migrationen Assembly 'Project.Data' überein. Ändern Sie entweder Ihr Zielprojekt oder ändern Sie Ihre Migrations Assembly . Ändern Sie Ihre Migrations Assembly mit DbContextOptionsBuilder. Beispiel: options.UseSqlServer (Verbindung , b => b.MigrationsAssembly ("Project.Api")). Standardmäßig handelt es sich bei der Assemblys für Migrationen um die Assembly, die den DbContext ..__ enthält. Ändern Sie Ihr Zielprojekt in das Migrationsprojekt, indem Sie das Standardprojekt droplet der Package Manager Console verwenden. oder durch Ausführen von "dotnet ef" in dem Verzeichnis, in dem sich das Migrationsprojekt befindet. "

Nachdem ich diesen Fehler gesehen hatte, versuchte ich diesen Befehl in Project.Api auszuführen: 

dotnet ef --startup-project ../Project.Api --Assembly "../../1 Data/Project.Data" - Migrationen hinzufügen Initial

und ich habe diesen Fehler bekommen: 

"Unerwarteter Wert '../../1 Domain/Project.Data' für Option 'Assembly'" 

Ich dont know why I get this error, when I try to execute the command with the- Assembly` Parameter.

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

Hat jemand ähnliche Probleme gehabt?

13
kdar

Alle EF-Befehle haben diese Prüfung :

if (targetAssembly != migrationsAssembly) 
       throw MigrationsAssemblyMismatchError;

targetAssembly = das Zielprojekt, an dem Sie arbeiten. In der Befehlszeile befindet sich das Projekt im aktuellen Arbeitsverzeichnis. In der Package Manager Console wird das Projekt im Dropdown-Feld oben rechts in diesem Fensterbereich ausgewählt.

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

1 - Zielbaugruppe ändern.

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 Migrationsassembly.

cd Project.Api/
dotnet ef migrations add Initial

// change the default migrations Assembly
options.UseSqlServer(connection, b => b.MigrationsAssembly("Project.Api"))
27
natemcmaster

Ich hatte das gleiche Problem, bis ich bemerkte, dass in der oberen Leiste der Package Manager-Konsole => "Default Projects" "Project.Data" und nicht "Project.API" sein sollte.

Sobald Sie die "Project.Data" aus der Dropdown-Liste als Ziel ausgewählt und die Migration ausgeführt haben, sollte dies in Ordnung sein.

12
Dre Ross

Ich lief auf das gleiche Problem und fand das

Wir versuchen, Ihre Migrationen in einer Klassenbibliothek auszuführen. So war ich. Stellt sich heraus, dass dies noch nicht unterstützt wird, müssen wir es umgehen.

EDIT: Ich habe Lösung gefunden auf diesem Git Repo

4
Alan Jagar

Derzeit denke ich, dass EF nur das Hinzufügen von Migrationen für Projekte unterstützt, die noch nicht in Klassenbibliotheken enthalten sind.

Und einfach Randnotiz für alle anderen, die Migrationen zu bestimmten Ordnern in Ihrem Projekt hinzufügen möchten:

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

Das einzige, was funktioniert, ist die Verwendung der Package Manager Console:

  1. Wählen Sie Ihr Standardprojekt aus
  2. mit dem Befehl -OutputDir-Befehlsparameter, z. B. Add-Migration InitConfigurationStore -OutputDir PersistedStores/ConfigurationStore-Befehl wird die mgiration im Ordner 'PersistedStores/ConfigurationStore' in meinem Projekt ausgegeben. 

Updates per 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)
        )
   );

   ...
}
4
David Liang

Mit EF Core 2 können Sie Ihr Web - Projekt leicht von Ihrem Data (DbContext) -Projekt trennen. Sie müssen lediglich die IDesignTimeDbContextFactory - Schnittstelle implementieren. Gemäß Microsoft docs ist IDesignTimeDbContextFactory:

Eine Factory zum Erstellen abgeleiteter DbContext-Instanzen. Implementiere das Schnittstelle, um Design-Time-Services für Kontexttypen zu aktivieren, die nicht einen öffentlichen Standardkonstruktor haben. Zum Entwurfszeitpunkt abgeleiteter DbContext Instanzen können erstellt werden, um bestimmte Entwurfszeiten zu ermöglichen Erfahrungen wie Migrationen. Design-Time-Services werden Erkennt automatisch Implementierungen dieser Schnittstelle, die sich in .__ befinden. die Startup-Assembly oder dieselbe Assembly als abgeleiteten Kontext.

Im unteren Codeausschnitt sehen Sie meine Implementierung von DbContextFactory, die in meinem Data -Projekt definiert ist:

public class DbContextFactory : IDesignTimeDbContextFactory<KuchidDbContext>
{
    public KuchidDbContext CreateDbContext(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        var dbContextBuilder = new DbContextOptionsBuilder<KuchidDbContext>();

        var connectionString = configuration.GetConnectionString("Kuchid");

        dbContextBuilder.UseSqlServer(connectionString);

        return new KuchidDbContext(dbContextBuilder.Options);
    }
}

Jetzt kann ich die EF-Migration initialisieren, indem Sie mein Web -Projekt als Startup-Projekt festlegen und in der Package Manager Console mein Data -Projekt auswählen.

Add-Migration initial

Weitere Details finden Sie hier . Dieser Blogbeitrag verwendet jedoch eine veraltete Klasse anstelle von IDesignTimeDbContextFactory.

4
Ehsan Mirsaeedi

(ASP.NET Core 2+)

Hatte das gleiche Problem. Folgendes habe ich getan:

  1. Verweisen Sie auf das Projekt, das den DbContext (Project.A) enthält, aus dem Projekt, das die Migrationen enthält (Project.B).

  2. Verschieben Sie die vorhandenen Migrationen von Project.A nach Project.B (Wenn Sie keine Migrationen haben - erstellen Sie sie zuerst)

  3. Konfigurieren Sie die Migrationsassembly in Project.A

options.UseSqlServer (connectionString, x => x.MigrationsAssembly ("Project.A"));

Angenommen, Ihre Projekte befinden sich im selben übergeordneten Ordner:

  1. dotnet ef migrations add Init --project ../AskGoo.Data -c DbContext

Die Migrationen gehen jetzt zu Project.B

Quelle: Microsoft

3
Kaloyan Drenski
Add-Migration NewMigration -Project MyApp.Migrations
2
Majid joghataey

Ich war mit einem ähnlichen Problem konfrontiert, obwohl die Antworten irgendwie direkt klappten und sie nicht funktionierten .. Meine Antwort ähnelt @Ehsan Mirsaeedi, mit einer kleinen Änderung in der DbContextFactory-Klasse. Anstatt Migration Assembly-Namen in Startup-Klasse der API hinzuzufügen, habe ich in der DbContextFactory-Klasse, die Teil des Data-Projekts (Klassenbibliothek) ist, erwähnt.

public class DbContextFactory : IDesignTimeDbContextFactory<KuchidDbContext>
{
   public KuchidDbContext CreateDbContext(string[] args)
   {
       var configuration = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json")
          .Build();

       var dbContextBuilder = new DbContextOptionsBuilder<KuchidDbContext>();

       var connectionString = configuration.GetConnectionString("connectionString");

       var migrationAssemblyName= configuration.GetConnectionString("migrationAssemblyName");

       dbContextBuilder.UseSqlServer(connectionString, o => o.MigrationAssembly(migrationAssemblyName));

       return new KuchidDbContext(dbContextBuilder.Options);
   }
}

Sie benötigen 'Microsoft.Extensions.Configuration' und 'Microsoft.Extensions.Configuration.Json', damit die SetBasePath- und AddJsonFile-Erweiterungen funktionieren.

Hinweis: Ich denke, das ist nur eine Umgehung. Es sollte die DbContextOptions von der Startklasse irgendwie abholen. Ich denke, es gibt definitiv Probleme mit der Verkabelung. 

0
Mady

Für alle, die mehrere Startprojekte haben.

Beachten Sie, dass Sie Ihr Zielprojekt als Startprojekt festlegen müssen - Project.Api (aus dem Fragenbeispiel) sollte das Startprojekt sein.

Hoffe das hilft jemandem :)

0
Atanas Sarafov