Bindung nach Entity Model first aktualisiert Daten nicht!

  • WPF

Es gibt 118 Antworten in diesem Thema. Der letzte Beitrag () ist von Jeiss.

    diese dolle Nuget-Auto-refresh hat bei mir nie funktioniert. Ich muss immer EF neu installieren - per Nuget.

    STRG+Shift+B
    Im Fall vom doofen ModelFirst muss man in den ModelDesigner und einfach irgendein Model ein wenig verschieben und dann STRG+Shift+B

    Muss halb aber auch aktiviert sein:


    Bei mir funtz das IMMER. Das passiert wenn man sich neuen Funktionen und Features nicht stellt. :D Spass

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

    Nofear23m schrieb:

    Im Fall vom doofen ModelFirst
    Kannste mal damit aufhören?
    Wenn wir mal dahin kommen, uns mit CodeFirst zu beschäftigen, wirst du dich nämlich höchstwahrscheinlich wundern, wieviel doofes ich daran finden können werde.

    Es sind unterschiedliche Philosophien, und du bist in CodeFirst eingearbeitet, in ModelFirst nicht.
    Ich bin zwar nicht in EF-ModelFirst eingearbeitet, aber bin gewohnt, ModelFirst zu denken - das hat durchaus schlagende Vorteile, wie sich möglicherweise noch erweisen wird.

    ErfinderDesRades schrieb:

    Kannste mal damit aufhören?

    Ne :D Ist meine Meinung und die gebe ich auch kund.

    ErfinderDesRades schrieb:

    und du bist in CodeFirst eingearbeitet, in ModelFirst nicht.
    Doch, habe lange ModelFirst gearbeitet, ist nur länger her.

    ErfinderDesRades schrieb:

    aber bin gewohnt, ModelFirst zu denken

    Verstehe ich, aber EF ist hierfür nie richtig ausgelegt worden. Eh schade, aber ist hald so.

    ErfinderDesRades schrieb:

    das hat durchaus schlagende Vorteile, wie sich möglicherweise noch erweisen wird.

    Darauf warte ich seit Jahren, ich bitte darum.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Ach so geht das...
    ​Der ​attachdbfilename=|DataDirectory| aus der app.config der wird im Konstruktor hier

    VB.NET-Quellcode

    1. ​AppDomain.CurrentDomain.SetData("DataDirectory", pth)
    gesetzt?
    ​Weiss nicht warum, aber ich dachte immer der |DataDirectory| wärer ein fesgesetzter Projekt-Ordner.
    ​Cool!
    Also doch "fest" (normalerweise)
    Genauer gesagt also doch bin/Debub? ok.
    Danke dass du das ins richtige Licht gestellt hast.

    Edit:
    Ihr habt mich ja wieder nicht ausreden lassen...
    Ich hab ein bisschen Verspätung. Ich klopp mich noch immer mit NuGet rum.
    Obwohl meine nuggets richtig eingestellt sind krieg ich trotzdem ne Fehlermeldung..!!

    Damit das Projekt ja weiter "portable" bleibt (so leid es mir auch tut, das Projekt muss noch paar mal hin- und her)
    Da gibt es ja nur zwei Möglichkeiten.
    1) Ich lad den nugget nochmal runter (obwohl ja richtig eingestellt) oder
    2) ich nehm die Version die NoFeaer23m gepostet hat und ich ändere die app.config und ergänze den Konstruktor und "That's it..." oder geht das nicht?

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

    Soooo... ich war heute gut drauf und hatte Lust.

    Ich habe mal ein Beispiel in MVVM erstellt. Dies ist nun eine korrekte umsetzung von MVVM mit allem was dazu gehört (weil es sicher auch wem interessieren könnte).
    Es kann jetzt nicht viel, das nötigste hald. Ich wollte einfach nur das von allem was dabei ist. Detailansicht, bearbeitung ausserhalb des DataGrids usw.
    Achja, und ohne dem ganzen CollectionChanged und AddHandler kram!
    Auch Messageboxen und Dialoge sind vom ViewModel verschwunden, haben dort ja nix zu suchen, das soll dem View überlassen bleiben.
    Das ist jetzt denke ich mal ein saubere Sache. Nicht perfekt, ist klar, da geht noch mehr. Aber ich kann ja jetzt nicht Stunden hier dran Arbeiten für das kleine Beispiel. 8-)

    @ErfinderDesRades mich würde deine Meinung interessieren. Auch wenn du es nicht glaubst, ich schätze diese sehr, weil du jemand bist der immer sehr sauber und strukturiert Coded. Ich meine, in einem Produktivsystem (wenn es größer wöre als dieses) hätte ich jetzt noch zwei Layer zwischen Model und ViewModel im UnitOfWork inkl. BusinessLogik. Ich finde das ViewModel sollte nix vom EF wissen. Würde mich freuen wenn du es dir mal ansiehst, habe da schon eineiges von dir lernen können mit so Beispielprojekten.

    Ich habe jetzt auch keine Bindung mehr auf ein Property einer Model Klasse, sondern nur noch auf Properties eines ViewModels, wie es sich gehört.
    Ausserdem (auch wie es sich gehört) kann nun kein Datensatz mehr gelöscht werden, im Grunde markiert man Datensätze in einer DB immer nur als gelöscht.

    LÖSCHEN
    Damit man sich aussuchen kann für welche Modelklasse dies gilt (das kein Datensatz gelöscht werden KANN) gibt es ein Interface ILogicalDelete.
    Bei jeder Model-Klasse welche dieses Interface implementiert KANN NICHT geköscht werden. So ist man auch vor sich selbst geschützt.
    Bewerstelligt wird dies in einer Logik beim überschreiben der DBContext.SaveChanges().
    Hier wird geprüft welche Entitäten sich geändert haben und es wird geprüft ob diese aus dem Context gelöscht wurden. Ist dies der Fall, wird dies Rückgägig gemacht und das IsDeleted Property auf True gesetzt sowie der DeletedTimestamp gesetzt.

    ERSTELLT und GEÄNDERT
    Es gibt auch ein Interface ILogicalTimestamp. Dient ähnlich wie die Sache oben mit dem löschen nur das beim Speichern automatisch durch den Context die Properties LastUpdateTimestamp oder CreationTimestamp gesetzt werden. Je nachdem was mit der Entität passiert ist.

    ModelBase
    Das Model hat auch eine Basisklasse. Somit hat jedes Model welches von ModelBase erbt folgende Properties CreatedBy, CreatedOn, LastUpdateBy, LastUpdateOn, RowVersion
    Die RowVersion ist für dieses Beispiel nicht so Relevant aber dennoch sehr interessant. Diese Eigenschaft wurde mit <TimeStamp> annotiert. Dadurch wird z.b. bei einem Update nicht z.b.:
    UPDATE table_name SET column1 = value1 WHERE Id=29 an die DB gesendet, sondern:
    UPDATE table_name SET column1 = value1 WHERE Id=29 and RowVersion=0x0000000000001772

    Die RowVersion ändert sich mit jeder bearbeitung eines Datensatzes. Bekommt EF also bei diesem Update zurück das 0 Datensätze von der änderung betroffen sind weis EF das es sich hier um einen Änderungskonflikt handelt und wirft die korrekte Exception welche man dann behandeln kann. z.b. weil jemand anderes inder zwischenzeit den Datensatz geändert hat.

    Messageboxen und Dialoge

    Es wurden mehrere Schnittstellen geschaffen und diese Anschliessend primitiv implementiert.
    Am besten ansehen: z.b. IMessageboxService in der ViewModel-Assembly und dann in der App die Implementierung in MessageBoxService

    Die Services werden im ApplikationStartup der APP mit ServiceInjector.InjectServices() instanziert.

    Hier noch tein Screenshot des Models:

    Hier noch ein Screenshot des ViewModels:


    Und anbei natürlich das Projekt
    @Jeiss Da ist jetzt wirklich alles drinnen was du brauchst. Wenn du diesen Code verstehst kannst du den Rest auch und das Model so anpassen wir du es brauchst.

    Schönes Neujahrsfest alle, ich gehe jetzt mal Feiern.
    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ErfinderDesRades schrieb:

    Was bedeuten die Pfeile, die unterschiedlichen Farben und Strichstärken?

    Hallo
    Blau (dick) ist die ganz normale Abhängigkteit.
    Viollet bedeutet das z.b. ein Property direkt darauf Verweist. Wie z.b. im MainWorkspace wo es eben OrdersVm und StatusBarVm gibt.
    Der dünne blaue Strich bedeutet das UregncyListVm mindestens einmahl direkt auf StatusVm zugreift. Und zwar im LoadData.
    Im Konstruktor wird die StatusVm Instanz mitgegeben und kann somit verwendet werden. Das wird hier visualisiert.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    sorry - nichtverstanden - was sind bei dir "normale Abhängigkeiten", und wie sähen "unnormale" aus?

    Also für mich wäre interessant, aus einer Übersicht zu erfahren, welches Objekt von welchem anderen Objekt einen Verweis enthält, oder aber eine Verweis-Liste enthält.
    Das verstehe ich unter Abhängigkeit (zusätzlich gibts noch Abhängigkeit durch Vererbung, aber hier glaub nicht relevant).

    Und wäre halt wichtig, anne Grafik erkennen zu können, ob EinzelVerweis oder Verweis-Menge.

    ErfinderDesRades schrieb:

    was sind bei dir "normale Abhängigkeiten", und wie sähen "unnormale" aus?

    Damit meinte ich das du and den Pfeilen erkennst in welche Richtung. X(

    ErfinderDesRades schrieb:

    Und wäre halt wichtig, anne Grafik erkennen zu können, ob EinzelVerweis oder Verweis-Menge

    Geht aus dieser Grafik nicht hervor. Innerhalb VS kann ich draufklicken, dann geht es auf und ich sehe weiteres. Ist ein ReSharper-Ding, am besten du schreibst das denen. *ggg*
    Aber immer noch besser als die Visual Studio Grütze mit Diagrammen finde ich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo alle zusammen.
    Ein schönes neues Jahr 2018 für jeden hier im Forum.

    Also Sacha, du warst ja noch besonders aktiv am letzten Tag des letzten Jahres :thumbup:

    ErfinderDesRades schrieb:

    Wow - downgeloaded, und ging gleich!

    Das kann ich nicht bestätigen. Mir wünscht mein VS ein gutes neues Jahr indem er mir gleich beim ersten Einsatz eine Fehlermeldung bringt...
    Hab Sachas Projekt runtergeladen, kurz in die Klassen reingeschaut, gestaunt und nicht viel verstanden(?!), dann wollte ich das Projekt mal mit F5 zum Leben erwecken.
    Und dann gleich das hier!

    ​Dieses Projekt müsste ja starten können, oder?
    ​Weiss vielleicht jemand weiter?

    Danke,
    ​Jeiss
    Aber @Jeiss
    Du musst hald das richtige Projekt zum Startprojekt machen. Steht aber in der Meldung!!

    Rechte Maustaste auf die App -> Als Startprojekt festlegen.

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

    Jeiss schrieb:

    Hab mich bloß nicht getraut

    Aber dafür ist es ja da! Du kannst es ja immer wieder neu laden. bzw. das ZIP immer wieder neu Entpacken. KAnnst also immer wieder zurück zum Uhrsprungszustand. Du kannst also gar nix vermurxen. 8|

    Jetzt ist für dich sowieso spielen angesagt!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo,
    ​Ist ein ganz schön harter Brocken für mich.....Pffff :S
    ​Ich weiß erstens nicht mal richtig mit welcher Frage ich anfangen soll, und zweitens weiß ich nicht mal wie ich sie stellen soll, damit ich verstanden werde.
    ​Muss mich eben noch ein wenig einarbeiten..
    ​Aber eine Frage möchte ich trotzdem loswerden:
    ​Womit beschäftige ich mich hier eigentlich gerade?
    ​Ok, MVVM muss es ja wohl sein.
    ​Aber wir sind ja wohl nicht mehr beim Model-First Konzept, Oder?
    ​Wurden das Model u. der Kontext OrdersDbContext irgendwie generiert oder ganz von Hand gecoded?

    Danke,
    Jeiss
    Sorry, das ist Code-First

    Ist aber im Grunde egal. Das Model und der Context sind ein eigenständiges Projekt, du kannst es also jederzeit wenn du willst gegen ein Model-First austauschen.
    Ich habe es nur gemacht weil ich es einfach gewohnt bin und es ja in zukünftigen Version nur noch Code-First gibt (ausser durch externe AddOns).
    Aber du hast es auch jeden Fall richtig erkannt. Ist Code-First. Ich habe die Klassen (Model) geschrieben (sind ja nur ein paar Zeilen) und im Context einfach eine Klasse erstellt welche von DBcontext erbt.
    In diese die Properties reingeschrieben (DBSet) welche die Tabellen darstellen sollen und fertig.

    Wenn du Fragen hast, gar kein Problem, wir haben alle offene Ohren.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    hmm - ich wollte jetzt mal gugge, was in der Db nu drinne ist, aber scheints mein SqlServer ist veraltet.
    Also ManagementStudio ging ja noch nie. Daher dachte ich, ich könnte ein EFModel From DataBase createn, aber geht auch nicht - kriege Fehler-Messagebox:
    ---------------------------
    Microsoft Visual Studio
    ---------------------------
    The database 'C:\PROGRAMMING\VS13\WPF\EFPASCHKA\URGENCYPLANNERMVVM\URGENCYPLANNER.APP\BIN\DEBUG\ORDERSDB.MDF' cannot be opened because it is version 782. This server supports version 706 and earlier. A downgrade path is not supported.

    Could not open new database 'C:\PROGRAMMING\VS13\WPF\EFPASCHKA\URGENCYPLANNERMVVM\URGENCYPLANNER.APP\BIN\DEBUG\ORDERSDB.MDF'. CREATE DATABASE is aborted.

    An attempt to attach an auto-named database for file C:\Programming\VS13\Wpf\EFPaschka\UrgencyPlannerMVVM\UrgencyPlanner.App\bin\Debug\ordersDb.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
    ---------------------------
    OK
    ---------------------------
    Ich wundere mich auch, dass der von CreateDatabase redet - ich hab "Generate Model From Database" geklickst, und bin zum Database-file gebrowst.

    naja - vmtl. könnt ihr da auch nicht helfen. Ich sollte wohl meinen SqlServer updaten, aber ich hab auch schon erlebt, dass das fehlschlug, und dann garnix mehr ging.
    Aber täte mich interessieren, ob Jeiss auch son Problem hat, wenner in die Db gugge will.
    Naja, das schöne am EF ist ja das man jederzeit das DB System ändern kann. Wenn bei dir also MySQL geht oder du einen MS SQL Server installiert hast ändere einfach den Connectionstring und gut ist. Mehr ist nicht zu tun. EF legt dir die DB beim ersten start an und dann kanst du sie dir ansehen.

    hoffe das hilft dir.

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