Ef Core Migration unter MVVM Struktur

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Ef Core Migration unter MVVM Struktur

    Hallo zusammen.
    Gegeben ist eine MVVM Struktur, wobei jeder Layer ein eigenes Projekt ist.
    Nun möchte ich das Entity Framework einbauen.
    Eine weiteres Projekt hinzugefügt und die Contextklasse erstellt. Soweit alles gut.
    Nun wollte ich via Ad-Migration ersteMigration eine Migration erstellen um danach dann mit Update-Database die Datenbank zu erstellen.

    Nur leider bekomme ich einen Fehler. Das startprojekt hat keinen Verweis auf EntityFramworkCore Design.
    Gut, nachinstalliert wie gewollt. Aber es tut sich nichts.
    Muss ich auf was bestimmtes achten, ist mein Vorgehen komplett falsch? Das Thema ärgert mich schon ein paar Tage und ich habe noch keinen Artikel gefunden der mir weiter hilft.
    Bei bedarf kann ich heute abend gerne ein beispiel hier anhängen.

    Danke.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Was ist das Projekt mit dem EF Context (Klassenbibliothek nehme ich an) denn für ein Projekt?
    Ein C# oder ein VB.Net Projekt. Denn EF Core unterstützt für die Migration nur C#. Das ist nun mal leider so.

    Also am besten das Projekt mit dem Context (ist nur eine Klasse) in C# machen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das Projekt ist C# und enthält nur eine Klasse welche von DbContext erbt. In dieser Klasse stehen 2 DbSet und 2 Methoden die überschrieben werden, eine allerdings ist leer. Dient meiner lernphase.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Überprüfen bitte folgende Dinge.

    Hast du EntityFramework Design als Nuget eingebunden?
    Probiere das Projekt als aktives Projekt im NuGet Commandofenster einzustellen.

    Sollte das nicht klappen schau ich mal genauer nach wie das mit solch einer Struktur im Moment ist. Welche Version von EF hast du aktuell am Start?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ja ich habe es über nuget installiert.
    Rechtsklick auf das Projekt und dann nugetPakete verwalten.
    Ich werde das andere heute abend testen, bin noch arbeiten.
    Installiert ist Version 3.1 von Efcore und den Efcore.Tools
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hi,
    ich glaub EFCore 3.1 ist nicht mit .Net unter 4.8 kompatibel, hatte das Problem auch und deswegen EFCore runter auf 2.x gemacht. Dann geht es.
    Btw warum nutzt du nicht Context.DataBase.EnsureCreated. Dann brauchst keine Migrationen. Die Funktion legt dir die DB samt allen Tabellen an wenn sie nicht existiert, wenn sie existiert tut sie nichts.
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo
    Er arbeitet eh mit .Net Standard.
    Und Migration will er ja nur probieren und lernen ob/wie es geht, was ja sinn macht. Sonst setzt man eine ganze App auf um am Ende dann keine Migrations durchführen zu können. Sprich, du kannst NIE ein Update rausbringen welche nur annäherd das Model ändert. Schlecht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    .net standard sind doch nur die Projekte, wenn du ein WPF App dran basteln willst musst du da ja auch efcore per nuget installieren und dann gehts halt nicht wenn Framework kleiner 4.8
    oder wie macht man es sonst?
    Migrations kannte ich jetzt nur von EF6
    "Hier könnte Ihre Werbung stehen..."
    Ne, muss man im Hauptprojekt nicht einbinden wenn man von dem Projekt aus nicht nicht darauf zugreift. Reicht im ViewModel bzw. Im DAL.

    Migration in EF6 funktionieren völlig anders als unter EF Core. Anderes Konzept.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das find ich jetzt aber Intersant, denn...
    ich hab in meiner solution das Context Projekt, dann hab ich ein DAL Projekt, Model und Viewmodel, alles als .Net Standard.
    so, im Viewmodel hole ich mir jetzt eine Liste von Personen über das Dal.
    Im WPF Projekt binde ich die Liste an ein Listview, OK, alles kein Hexenwerk... aber, sobald ich starte, fliegt mir eien FileNotFound Execption um die Ohren und es wird angemeckert das im Viewmodel das Paket EFCore nicht da ist... gut, per nuget nachinstallieren, wieder starten...bums, wieder fehler nuget efcore fehlt, also auch im WPF nachinstalliert und siehe da, nu gehts.

    ich weis das Du mal geschrieben hattest das EFCore Nur im Context und DAL installiert sein muss und sonst nirgendwo.

    aber, so wie ich es versuche muss ich es überall installieren.
    ist übrigens auch mit allen andern nuget paketen so, die im Viewmodel installiert sind, die müssen auch im WPF nachinstalliert werden.

    so und wenn ich nun EFCore 3.1 installiert habe, knallt es beim nachinstallieren weil .NET nicht mehr unterstützt wird sondern nur noch .Net Core
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Dann kopierst du mal die dlls per Hand in das Ausgabeverzeichnis und schon klappt es.

    Visual Studio checkt eben nicht das es die Files benötigt und kopiert diese nicht beim Kompilieren.

    Aber auch das kann ja mit den PreBuild Actions automatisiert werden. BTW: ich glaube beim ner .Net Core WPF Anwendung kopiert er sogar die Files ohne das er einen Verweis benötigt, da kann ers glaube ich sogar.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also ich habe es nochmal probiert, aber scheinbar habe ich alles vollkommen falsch verstanden und demnach völlig falsch umgesetzt.
    Ich habe mal mein Projekt angehangen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Akanel“ ()

    Hallo zusammen,
    ich habe im obigen beitrag den Anhang wieder entfernt da er nicht kompilierbar war.

    Inzwischen habe ich es zum laufen bekommen, was aber weitere fragen aufwirft.
    Ich habe bisher folgenden Aufbau.



    Model und Context sind beide .Net Standard 2.0, der Rest ist .Net Framework 4.7.2

    Nun habe ich wie schon mal beschrieben EntityFrameWork.Core 3.1.0 per NuGet installiert. Und zwar im Projekt HStatistik.Context.
    Dann eben schnell die DbSet angelegt und 2 Methoden. Sieht dann so aus.

    C#-Quellcode

    1. using HStatistik.Model;
    2. using Microsoft.EntityFrameworkCore;
    3. using System;
    4. using System.Collections.Generic;
    5. using System.Text;
    6. namespace HStatistik.Context
    7. {
    8. class StatsDbContext :DbContext
    9. {
    10. public DbSet<SalesStaff> SalesStaffs { get; set; }
    11. public DbSet<Plan> Plans { get; set; }
    12. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    13. {
    14. optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=HStatistik;Trusted_Connection = True;");
    15. }
    16. protected override void OnModelCreating(ModelBuilder modelBuilder)
    17. {
    18. }
    19. }
    20. }


    OK dachte ich mir, dann mal versuchen eine Migration zu erstellen.
    Peng. Fehler.
    Für das Startprojekt muss EntityFrameworkCore.Design installiert sein.
    Hmmm, keine Ahnung warum, aber wenn er das sagt machen wir das mal.
    OK, nächster versuche eine Migration zu erstellen.
    Peng. Wieder Fehler.
    Das Startprojekt kann keinen Context finden. ?????? Wat will er?
    Dachte er will einen Verweis auf das Context Projekt, also eben schnell einen gesetzt.
    Wie erwartet, selber fehler.
    Dann habe ich EntityFrameworkCore.Sql im Startprojekt installiert, welches aber .Net Framework 4.7.2 ist.
    Dürfte ja eigentlich nicht gehen, weil es ja angeblich nicht mehr unterstützt wird.
    Tada, es funktioniert. Ich kann Migrations erstellen und per Update-Database an die Datenbank weitergeben.

    Kann mir das mal einer erklären? Ich bekomme es nicht in den Kopf.

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <packages>
    3. <package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.0" targetFramework="net472" />
    4. <package id="Microsoft.Bcl.HashCode" version="1.1.0" targetFramework="net472" />
    5. <package id="Microsoft.CSharp" version="4.7.0" targetFramework="net472" />
    6. <package id="Microsoft.Data.SqlClient" version="1.0.19269.1" targetFramework="net472" />
    7. <package id="Microsoft.Data.SqlClient.SNI" version="1.0.19235.1" targetFramework="net472" />
    8. <package id="Microsoft.EntityFrameworkCore" version="3.1.0" targetFramework="net472" />
    9. <package id="Microsoft.EntityFrameworkCore.Abstractions" version="3.1.0" targetFramework="net472" />
    10. <package id="Microsoft.EntityFrameworkCore.Analyzers" version="3.1.0" targetFramework="net472" />
    11. <package id="Microsoft.EntityFrameworkCore.Design" version="3.1.0" targetFramework="net472" developmentDependency="true" />
    12. <package id="Microsoft.EntityFrameworkCore.Relational" version="3.1.0" targetFramework="net472" />
    13. [b]<package id="Microsoft.EntityFrameworkCore.SqlServer" version="3.1.0" targetFramework="net472" />[/b]
    14. <package id="Microsoft.Extensions.Caching.Abstractions" version="3.1.0" targetFramework="net472" />
    15. <package id="Microsoft.Extensions.Caching.Memory" version="3.1.0" targetFramework="net472" />
    16. <package id="Microsoft.Extensions.Configuration" version="3.1.0" targetFramework="net472" />
    17. <package id="Microsoft.Extensions.Configuration.Abstractions" version="3.1.0" targetFramework="net472" />
    18. <package id="Microsoft.Extensions.Configuration.Binder" version="3.1.0" targetFramework="net472" />
    19. <package id="Microsoft.Extensions.DependencyInjection" version="3.1.0" targetFramework="net472" />
    20. <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="3.1.0" targetFramework="net472" />
    21. <package id="Microsoft.Extensions.Logging" version="3.1.0" targetFramework="net472" />
    22. <package id="Microsoft.Extensions.Logging.Abstractions" version="3.1.0" targetFramework="net472" />
    23. <package id="Microsoft.Extensions.Options" version="3.1.0" targetFramework="net472" />
    24. <package id="Microsoft.Extensions.Primitives" version="3.1.0" targetFramework="net472" />
    25. <package id="Microsoft.Identity.Client" version="3.0.8" targetFramework="net472" />
    26. <package id="System.Buffers" version="4.4.0" targetFramework="net472" />
    27. <package id="System.Collections.Immutable" version="1.7.0" targetFramework="net472" />
    28. <package id="System.ComponentModel.Annotations" version="4.7.0" targetFramework="net472" />
    29. <package id="System.Data.Common" version="4.3.0" targetFramework="net472" />
    30. <package id="System.Diagnostics.DiagnosticSource" version="4.7.0" targetFramework="net472" />
    31. <package id="System.Memory" version="4.5.3" targetFramework="net472" />
    32. <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net472" />
    33. <package id="System.Runtime.CompilerServices.Unsafe" version="4.7.0" targetFramework="net472" />
    34. <package id="System.Threading.Tasks.Extensions" version="4.5.2" targetFramework="net472" />
    35. </packages>


    Wieso muss das Startprojekt, welches .Net Framework 4.7.2 ist, EFCore.Sql 3.1.0 installiert haben.
    Eigentlich sollte das nicht funktionieren und ich müsste das Startprojekt auf .Net Standard ändern.

    Und warum muss das Paket im Startprojekt überhaupt installiert werden? Das Startprojekt hat doch mit der Datenbank oder dem EF gar nichts zu tun.

    Was ist wenn irgendwann mal weitere Layer dazu kommen, BusinessLogic und Repository die eigentlich für die Kommunikation zur Datenbank sind?


    Eigentlich, so hatte ich es verstanden, brauchen doch nur das Context und das Repository(wenn es mal dazu kommt) Projekt EF, der rest hat damit nichts zu tun.

    Kann mir das jemand versuchen zu erklären?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Das hast du richtig verstanden. Der Context und das Repository (welches du ja noch nicht hast) müssen .Net Standard sein und einen Verweis auf EF Core haben. Sonst nix.
    Was lediglich "überbleibt" ist evtl. das kopieren der EF Core Files und deren Abhängigkeiten was ja über die Post-Build Kommandos gemacht werden kann.

    Das mit dem "Startprojekt" ist so eine Sache und kann gerne falsch verstanden werden. Damit meint EF nicht "dein" Startprojekt, also die EXE im direkten sinne sondern er will das du (für den kurzen Zeitraum der Migration) den Context zum Startprojekt machst.
    Also, Context als Startprojekt -> Migrieren -> Startprojekt wieder umstellen.

    Bist du sicher das du beim Probieren EF Core 3.1 für dein WPF Projekt installiert hast? Das darf und kann im Grunde nicht gehen. =O
    Sicher das es nicht zufällig doch die 2.9 oder so war?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Bist du sicher das du beim Probieren EF Core 3.1 für dein WPF Projekt installiert hast?


    Schau mal in den Spoiler meines Vorheriogen Posts. Das ist die Packagedatei des Startprojektes.
    Da steht

    XML-Quellcode

    1. <package id="Microsoft.EntityFrameworkCore.SqlServer" version="3.1.0" targetFramework="net472" />
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Sehr cool, gerade hier nachgesehen und siehe da..... Die sind für die 3.1 wieder zurück zu .Net Standard 2.0 anstatt auf .Net Standard 2.1 wie bei EF Core 3.0.1 gegangen.

    OK, dann ist es aktuell wieder mit .Net 4.7.2 kompatibel. Sehr cool, wusste ich garnicht :D
    Stimmt, dann klappt das. Danke für die Info. Das finde ich ziemlich geil.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Damit meint EF nicht "dein" Startprojekt, also die EXE im direkten sinne sondern er will das du (für den kurzen Zeitraum der Migration) den Context zum Startprojekt machst.


    Also reicht es nicht wenn ich in der Paket Manager Konsole das Projekt angebe? So wie auf dem Bild?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Soweit ich mich erinnern kann nicht, ist bei mir schon länger her das ich es probiert hatte. Kann es aber gerne heute Abend mal nochmals probieren.

    Stell doch bitte nochmals dein Projekt Online damit ich einfach beim versuch die selben "gegebenheiten" habe.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok kann ich gerne machen.
    Aber es wird gross wenn ich alle Pakete (EfCore) und so mitliefere. Kann ich die irgendwie rausnehmen das jeder diese dann "Nachholen" muss?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.