Was EF nicht kann

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ISliceUrPanties.

    Was EF nicht kann

    In diesem Thread versteige ich mich in die Behauptung, dass der EF-DbContext im Gegensatz zum typDataset nur eingeschränkt relational ticken tut.
    Und werde prompt gefragt, wie ich darauf komme.
    Darauf habe ich jetzt einen meiner Uploads ausgebuddelt - von hier: Grundlagen: Relationale Datenmodellierung, der einen Standard-View zeigt, nämlich den m:n-View.
    Und klein Bilderserie gemacht:

    Hier sieht man einen doppelten m:n-View: Oben sind Personen nach Beruf aufgegliedert, unten Berufe nach Personen.
    Oben ist der Beruf 'Polizist' gewählt, und unten die Person 'Sigi'
    Wie man sieht, erscheinen oben drei Personen mit dem Beruf 'Polizist' - Sigi ist nicht dabei.
    Natürlich nicht, denn wie man unten sieht: Sigi hat gar keinen Beruf.

    So, nun gebe ich ihm den Beruf 'Polizist':
    . . .
    Und Wups - logisch! - erscheint Sigi im oberen m:n - View als eine der Personen, die dem Berufstand der Polizisten angehören.
    Das ist relationale Logik: Sobald Sigi der Gruppe der Polizisten zugeordnet wird, erscheint er in der Gruppe der Polizisten.





    Ich hab mich vor langem mit EF abgemüht, dasselbe Verhalten hinzubekommen - ganz gelungen ist es nicht: EntityFramework-CodeFirst-Sample
    Dort zeigt der m:n-View Category - Suppliers, also oben sind die Supplier (Lieferanten) nach Category aufgegliedert - die anderen Spalten sind nicht so ganz entscheidend wichtig
    Und unten die Categories nach Supplier.


    Wenn ich hier nun dem Artikel 'catArt1' die Category 'Cat2' zuordne - schlägt im oberen View die relationale Logik nicht zu ('catArt1' müsste aus der Cat1-Gruppe verschwinden, und in Cat2 auftauchen).
    Stattdessen haben wir nun einen inkonsistenten oberen View: Gezeigt werden die Artikel der Kategorie 'Cat1', und unzulässigerweise befindet sich nachwievor auch der Artikel 'cat1Art1' darunter - mit der Category 'Cat2'!!


    Die Aufregung beruhigt sich, wenn man abspeichert. Also wenn Ef dann einen Roundtrip über die Datenbank und zurück macht ist der obere m:n-View wieder konsistent:


    Näher bin ich bei aller Mühe mit dem EF nicht an ein wirklich relationales Verhalten herangekommen. Dabei habe ich schon allerlei und auch schmutzige Tricks angewandt, um das überhaupt soweit hinzubekommen.
    Hallo ErfinderdesRades

    Da ich heute viel Unterwegs bin kann ich es mir leider nicht gleich ansehen. Schaut aber interessant aus. Ich versuche so schnell als möglich mal das Projekt nachzustellen und melde mich wieder.

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

    Hallo

    Heute habe ich etwas Zeit, ich verstehe aber nicht ganz wo jetzt da das Problem an EF liegen soll.
    Habe ich das richtig verstanden das korrekt gespeichert wird und eine relationale speicherung vollumfänglich von statten geht?

    Ich hoffe ich habe die Problemstellung korrekt verstanden. Denn im Grunde (wenn ich richtig liege) geht ja ums nachführen der View. Richtig?

    Da komm ich jetzt aber gerade nicht mit was das mit EF zu tun hat? Evtl. habe ich es auch falsch verstanden.

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

    Aber das hat doch nix mit dem EF zu tun. EF speichert korrekt, EF stellt die verknüpfungen zu den Entitäten korrekt her, was kann EF denn dann dafür das der Programmierer nicht fie View aktualisiert?

    Deshalb kann ich doch nicht sagen das EF nicht relational arbeitet. Denn das tut es doch. Zumindest wenn der Programmierer seine Arbeit macht.

    Aber wenn du darauf hinaus willst das in WinForms das Dataset Gedöns besser an die View (gerade mit DataGrid) geknppft ist dann hast du völlig recht, aber das ist ja nicht das Ziel von EF. EF ist ein O/R Mapper und soll auch nur ein solcher bleiben wenn man mich fragt. Und diese Aufgabe erledigt es ja auch super. EF ist ein eigenständiges Produkt und der Programmierer muss eben sehen wie er dieses einsetzt.

    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:

    Deshalb kann ich doch nicht sagen das EF nicht relational arbeitet. Denn das tut es doch. Zumindest wenn der Programmierer seine Arbeit macht.
    Nenn es wie du willst.
    Das Problem ist, dass mit EF gebaute databinding-getriebene Views in bestimmten Fällen inkonsistent werden können. Und das kann man als Programmierer kaum beeinflussen - ich wüsste jdfs. nicht wie.
    Die beste Annäherng, die ich gefunden habe ist so wie ichs gebastelt habe, und zusätzlich muss man dann bei jedem Zucken abspeichern, um die View zu aktualisieren (was imo nicht das Ziel von Datenbank-Zugriffen sein sollte).

    Ich finde das Dataset-Gedöhns inne WPF übrigens nicht besser ans View geknüpft, weil das Binding-Picking im Xaml-Designer bei Datasets nicht funktioniert.
    Da ist man wieder auf String-Smells ohne Ende angewiesen, was man doch eiglich hinter sich gelassen glaubte.
    Ich sprach auch nicht von WPF sondern von WinForms.
    Also mal ehrlich, EF als nicht oder nur bedingt relational zu bezeichnen weil die View, mit der EF nichts zu tun hat, in mamchen Fällen nicht out of the box nachgeführt wird ist schon heftig. Ist doch wie Äpfel mit Birnen zu vergleichen. Und es ist ja nicht so als gäbe es keine möglichkeit solch einen View zu bauen.
    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. ##

    Wie gesagt: Nenn es wie du willst:
    Meinetwegen funktioniert EF 100% relational und hat nichts mit der View zu tun.
    Aber bestimmte Views kann man databinding-getrieben eben nicht bauen, wenn man mit EF arbeitet.
    Widersprüchlich? - deine Bestimmung von EF, und meine praktischen Erfahrungen damit.

    Nofear23m schrieb:

    Und es ist ja nicht so als gäbe es keine möglichkeit solch einen View zu bauen.
    Hmm - ich habs versucht - mir ist nichts überzeugendes gelungen.
    What?
    1. Warum soll man gewisse Views nicht bauen können
    2. Selbst wenn hat es mit den Daten doch nichts zu tun.

    EF hat nichts mit der View zu tun. Letzten endes sind es Klassen. Es liegt an dir wie du diese gestalltest. Und gerade in der WPF mit MVVM ist selbst das egal weil man ja mit ViewModels arbeitet und diese wieder anders gestaltet sein können, eben auf deine View zugeschnitten, also völlig unabhängig vom Model.
    Aber genau da kommen wir jetzt zu dem Thema das du es gerne verurteilst extra ViewModel Klassen zu erstellen weil du meinst das macht keinen sinn. Ups, macht es das doch?

    Aber das hat letzten endes nicht mit einem OR Mapper zu tun, welchen auch immer. Also lass bitte behauptungen wie das EF nicht relational arbeitet. Gewisse Dinge sind aufgrund des Bindings gerade in der WPF mamchesmal etwas schwieriger zu handeln, manches aber auch einfacher, aber deine Grundaussage stimmt einfach so nicht. Bei einigen Dingen gebe ich dir ja recht. Kein Thema, aber die Grundaussage und der Grund für diesen Thread, sorry, aber der ist in meinen Augen nicht nachvollzierbar und wie man siehst auch nicht korrekt. Ich dachte ja erst das es wirklich ein Problem beim persistieren gebe aber da EF alles richtig macht finde ich passt dein Eingangstext nicht.
    Was wir aber gerne machen könnten, das wir uns mal angucken wie man mit MVVM solch ein View bauen würde welches in deinen Augen dann auch korrekt ist und alle Daten nachgeführt werden.
    Das wäre eine Idee, dann hätte die nachwelt auch was davon.

    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:

    Was wir aber gerne machen könnten, das wir uns mal angucken wie man mit MVVM solch ein View bauen würde welches in deinen Augen dann auch korrekt ist und alle Daten nachgeführt werden.
    Das wäre eine Idee, dann hätte die nachwelt auch was davon.
    Hmm - ich hoffte eiglich, du würdest dich mal dransetzen, wenn Zeit.
    Eine korrekt nachführende View habich ja in Winforms gebaut und in EntityFramework-CodeFirst-Sample angehängt.
    Ein gleiches in Wpf habich nicht hingekriegt - auch den Versuch habichdaja angehängt.
    Hallo

    OK. Ich vermute ich komme heute Abend dazu. Werde ich dann hier hochladen.

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

    Hallo @ErfinderDesRades

    Ich hoffe du meintest es so, sonst gib bitte Bescheid, mit interessiert das selbst wo genau das Problem ist und will das weiter Analysieren und versuchen zu vereinfachen.

    Grüße
    Sascha
    Dateien
    • EfTest.zip

      (305,17 kB, 50 mal heruntergeladen, zuletzt: )
    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. ##

    Nanu?
    Keinerlei reaktion mehr?
    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. ##

    Uih! - ist mir durch Lappen gegangen - weiss auch nicht warum.
    Vermutlich weil ich Ende Mai, Anfang Juni in verreist war? (Aber 15.Mai - das war doch lang genug davor??)
    Jetzt die letzten 4 Tage hab ichs wohl gesehen, wollte mir aber Zeit dafür nehmen.
    Hab ich jetzt und - ätsch! - ich hab kein net.5
    Bin auch unlustig, es zu installieren - meine Kiste ist eh schon Schnecken-langsam.

    Du kannst das nicht zufällig auf 4.7 downgraden?

    ErfinderDesRades schrieb:

    Du kannst das nicht zufällig auf 4.7 downgraden?

    Probieren kann ichs, weis jetzt gerade nicht in wie weit EF Core gerade mit 4.7 arbeitet.

    Probier ich die Tage.

    Grüße
    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:

    EF Core gerade mit 4.7 arbeitet

    Gar nicht. Für .NET Framework 4.x gibt es Entity Framework (ohne Core). Bedeutet auch, ein ggf. anderes Verhalten und Umsetzung.

    ErfinderDesRades schrieb:

    Bin auch unlustig, es zu installieren - meine Kiste ist eh schon Schnecken-langsam.

    .NET 5 macht deine Kiste nicht langsamer.

    ISliceUrPanties schrieb:

    Gar nicht.

    Von wo haste das denn?

    Solange EF Core noch unter .Net Standard 2.0 welches von .Net 4.7 unterstütz wurde ist alles gut.
    Und das ist bis zu EF Core 3.1.17 der Fall. Also kannst du EF Core unter .Net 4.7 nutzen. Erst ab der Preview 5 wurde auf .Net Standard 2.1 umgestellt.

    ISliceUrPanties schrieb:

    .NET 5 macht deine Kiste nicht langsamer.

    Da gebe ich dir aber recht.

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