myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Warum kann nach Migration auf .NET 5 und EFCore keine Instanz vom DbContext mehr erstellt werden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum kann nach Migration auf .NET 5 und EFCore keine Instanz vom DbContext mehr erstellt werden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster


Duesmannr ist offline

Warum kann nach Migration auf .NET 5 und EFCore keine Instanz vom DbContext mehr erstellt werden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hey,

ich migriere gerade meine Projekte auf .NET 5 und so auch EF Core.

Nun ist mir ein Problem bei der Erstellung der Migrationen aufgefallen.

Ausgangssituation zum erstellen der Migrationen.
1. .NET 5 Class Library mit dem DbContext
Installierte NuGets:
Microsoft.EntityFrameworkCore 5.0.0
Microsoft.EntityFrameworkCore.SqlServer 5.0.0

C#-Code:
public class ApplicationDbContext : DbContext
    {
        #region DbSets

        public DbSet<User> Users { get; set; }

        #endregion

        public ApplicationDbContext(DbContextOptions options) : base(options)
        {
        }

        public ApplicationDbContext() : base()
        {
        }
    }

2. Test Projekt .NET 5 was ich als Start Projekt ausgewählt habe und via der Package Manager Console

add-migration Initial

ausführe. (Default Projekt ist die Class Library).

Bis meinen installierten NuGet Versionen von 3.1.8 funktionierte es auch, weil das Test Projekt ausführbar ist.
Nach updaten auf .NET 5 erhalte ich folgende Fehlermeldung:

Fehlermeldung:
PM> add-migration Initial
Build started...
Build succeeded.
Unable to create an object of type 'ApplicationDbContext'. For the different patterns supported at design time, see  https://go.microsoft.com/fwlink/?linkid=851728

In den Breaking Changes von EF Core 5 habe ich keine Änderungen gefunden, die das behindern sollten.

In den Github Issues von efcore habe ich den  Artikel gefunden, dass es bei einem funktioniert, der das sagt:

Zitat:
You can add an option such as sqlOptions.MigrationsAssembly();

Habe ich auch gemacht, gleiche Fehlermeldung. Bzw. erwartet die Methode einen Parameter, die Assembly. Habe ich ebenfalls hinzugefügt, aber ändert nichts.

Habt Ihr eine Lösung dafür?
Oder einen Ansatz?

Grüße
27.11.2020 20:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.690
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hast du auch mal den letzten Kommentar in dem Issue angeschaut und geprüft.
Das scheint es noch ein Problem mit Interfaces zu geben, was du ggf. haben könntest.

 https://github.com/dotnet/efcore/issues/23261

T-Virus
27.11.2020 20:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster

Themenstarter Thema begonnen von Duesmannr

Duesmannr ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von T-Virus:
Das scheint es noch ein Problem mit Interfaces zu geben, was du ggf. haben könntest.

Das Problem habe ich gar nicht. Also ich nutze gar keine Interfaces oder sonst was.
Die User Klasse hat nur 3 Properties und die ganze Class Library hat 2 Klasssen (User und ApplicationDbContext).


Es gibt einen "Workaround" dafür, indem man in der gleichen Assembly eine ContextFactory hat:

C#-Code:
public class ContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();

            return new(optionsBuilder.Options);
        }
    }

Damit lassen sich nun Migrationen erstellen.

Aber würde das gerne ohne den "Workaround" machen.
28.11.2020 00:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.373
Entwicklungsumgebung: Visual Studio Preview
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das ist kein Workaround, sondern Konzept.
Genau für diese Befehle ist die Factory da, die soll einen DbContext mit für DesignTime geeigneten Options erzeugen.

Richtig aufgebaut weiß der DbContext nichts von seiner Konfiguration, denn die kommt von einem DI-Container, da kann man dann DbContextOptions registrieren.
Der DbContext kann aber nur dann sinnvoll automatisch (also ohne Options) erzeugt werden, wenn er sich selber konfigurieren kann - was man ja eigentlich nicht will.
Also entferne mal den Konstruktor mit den Options, ich könnte mir vorstellen, dass es dann funktioniert - vorausgesetzt, der DbContext kann sich selber konfigurieren. Besser wäre aber, Du nutzt die Factory und ziehst die Konfiguration raus.

Ich baue mir dafür normalerweise eine eigene EFCoreTools-Exe ins Projekt, da liegt dann eine Factory drin.
Der erzeugte DbContext stellt die Verbindung zu einer Dummy-Datenbank her und nutzt sie dann für die Migrationen als Abgleich.
Und ich nutze sie, um zu schauen, ob mein Mapping auch wirklich so in der Datenbank ankommt, wie ich mir das vorgestellt habe.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am 28.11.2020 10:34.

28.11.2020 10:15 Beiträge des Benutzers | zu Buddylist hinzufügen
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster

Themenstarter Thema begonnen von Duesmannr

Duesmannr ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Palladin007:
Also entferne mal den Konstruktor mit den Options, ich könnte mir vorstellen, dass es dann funktioniert - vorausgesetzt, der DbContext kann sich selber konfigurieren. Besser wäre aber, Du nutzt die Factory und ziehst die Konfiguration raus..

Dann funktioniert es.
28.11.2020 10:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 21.01.2021 05:21