Model erstellen Verständnisproblem

  • WPF

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

    Model erstellen Verständnisproblem

    Hallo zusammen,

    ich versuche gerade ein kleines Programm von Winforms in WPF umzubauen.

    Es geht darum das ein Vertriebsmitarbeiter einer anderen Firma Pläne in einem Portal bereitstellt.
    Wir können uns diese dann runterladen, entsprechend bearbeiten und wieder neu einspielen.
    Wichtig sind dabei nur welcher Vertriebler(Name bzw. Kürzel) den Plan an welchem Tag eingespielt hat und wann wir ihn wieder zurückspielen.
    Das ganze soll dann in dem Programm protokolliert werden. Am Monatsende soll eine Statistik gedruckt werden.

    Ein Vertriebler kann einen oder mehrere Pläne erstellen, aber jeder Plan hat immer nur einen Vertriebler.
    Das ist, wenn ich es richtig verstanden habe, eine 1:n Beziehung.

    Wie erstelle ich nun so eine Beziehung in einem WPF Model?

    Mein Versuch bisher sieht so aus:

    Klasse Vertriebsmitarbeiter:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SalesStaff
    2. Inherits ModelBase
    3. Private _name As String
    4. Public Property Name() As String
    5. Get
    6. Return _name
    7. End Get
    8. Set(ByVal value As String)
    9. _name = value
    10. End Set
    11. End Property
    12. Private _planId As Guid
    13. Public Property PlanID() As Guid
    14. Get
    15. Return _planId
    16. End Get
    17. Set(ByVal value As Guid)
    18. _planId = value
    19. End Set
    20. End Property
    21. End Class


    Klasse Pläne:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Plan
    2. Inherits ModelBase
    3. Private _planNumber As Integer
    4. Public Property PlanNumber() As Integer
    5. Get
    6. Return _planNumber
    7. End Get
    8. Set(ByVal value As Integer)
    9. _planNumber = value
    10. End Set
    11. End Property
    12. Private _institution As String
    13. Public Property Institution() As String
    14. Get
    15. Return _institution
    16. End Get
    17. Set(ByVal value As String)
    18. _institution = value
    19. End Set
    20. End Property
    21. Private _setOn As DateTime
    22. Public Property Seton() As DateTime
    23. Get
    24. Return _setOn
    25. End Get
    26. Set(ByVal value As DateTime)
    27. _setOn = value
    28. End Set
    29. End Property
    30. Private _uploadedOn As DateTime
    31. Public Property UploadedOn() As DateTime
    32. Get
    33. Return _uploadedOn
    34. End Get
    35. Set(ByVal value As DateTime)
    36. _uploadedOn = value
    37. End Set
    38. End Property
    39. Private _comment As String
    40. Public Property Comment() As String
    41. Get
    42. Return _comment
    43. End Get
    44. Set(ByVal value As String)
    45. _comment = value
    46. End Set
    47. End Property
    48. Private _finished As Boolean
    49. Public Property Finished() As Boolean
    50. Get
    51. Return _finished
    52. End Get
    53. Set(ByVal value As Boolean)
    54. _finished = value
    55. End Set
    56. End Property
    57. Private _toCalculate As Boolean
    58. Public Property ToCalculate() As Boolean
    59. Get
    60. Return _toCalculate
    61. End Get
    62. Set(ByVal value As Boolean)
    63. _toCalculate = value
    64. End Set
    65. End Property
    66. End Class


    Klasse ModelBase:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public MustInherit Class ModelBase
    2. Public Property ID() As Guid = Guid.NewGuid
    3. Public Property CreatedOn() As DateTime = DateTime.Now
    4. Public Property CreatedBy() As String = Environment.UserName
    5. End Class
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo Akanel

    Akanel schrieb:

    Das ist, wenn ich es richtig verstanden habe, eine 1:n Beziehung.

    Sehe ich auch so. Hast du aber im Model nicht.

    Akanel schrieb:

    Es geht darum das ein Vertriebsmitarbeiter einer anderen Firma Pläne in einem Portal bereitstellt.

    Wie passiert das? Habt ihr da eine Web API? Dann sollte es ja ein Model geben oder? OK, falls nicht:

    VB.NET-Quellcode

    1. Public Class SalesStaff
    2. Inherits ModelBase
    3. Public Sub New()
    4. Plans = New List(Of Plan)
    5. End Sub
    6. Public Property Name() As String
    7. Public Property Plans() As ListOf(Plan)
    8. End Class


    PS: Wenn es reine Model-Klassen sind/bleiben kannst du dir die PRoperties mit Backingfield sparen, werden nicht benötigt.

    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:

    Wie passiert das? Habt ihr da eine Web API?

    Nein. Das ist ein reines Portal der anderen Firma. Wir können uns da lediglich einloggen und die entspechenden Pläne runterladen oder eben nach bearbeitung wieder einspielen. Mehr nicht.

    Das Programm soll auch nur für meine Frau als Statistik dienen.

    Nofear23m schrieb:

    Wenn es reine Model-Klassen sind/bleiben kannst du dir die PRoperties mit Backingfield sparen, werden nicht benötigt.

    OK, das wäre eine meiner nächsten fragen gewesen. :)
    Benötige ich dann erst im Viewmodel.

    Nun hast du mir fertigen Code gegeben, aber ich verstehe leider nicht wie sich das nun zusammensetzt. (Mag sein das ich verwöhnt bin vom DataSetDesigner aus Winforms, da konnte man das schön sehen.)

    Mir platzt der Schädel weil es einfach nicht klick macht.

    Ich probiere es mal aus. Bekomme gerade nicht mal eine gescheite Formulierung des Problems in Worte gefasst.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Naja, ich denke das du zu kompiziert denkst, das ist es nämlich gar nicht.

    Du hast ja gesagt. "Es gibt Vertriebsmitarbeiter und jeder soll x Pläne haben." also hat der Vetriebsmitarbeiter eine Liste von Plänen. = List(Of Plan)

    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:

    ich denke das du zu kompiziert denkst

    Wahrscheinlich. Denn ich mache mir Gedanken darüber wie die ID´s verknüpft werden. Quasi die ForeignKeys.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Müssen sie nicht. Wie speicherst du denn??

    Sowohl mit EF als auch beim Serialisieren ist dies nicht notwendig. In der List Of ist alles drinnen. Eine Liste von Plan. Und Plan hat ne ID in Form einer Guid welche sie von der Basisklasse erbt. Also alles gut.

    Wie willst du denn speichern bzw. auch wo?
    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. ##

    Speichern möchte ich das ganze erstmal als XML, also Serialisieren. Aber ich mache eines nach dem anderen, da ich ja schon Probleme bei dem Model hatte.
    Wenn das soweit sitzt das ich auch wirklich alles verstanden habe, soll auch mal EF dran kommen. Aber soweit bin ich noch nicht.

    Ich möchte das ganze als Übungsprojekt hernehmen. Auch wenn EF hier weit über das Ziel hinaus geht, aber zur Übung halt.

    Mit dem Komplizierten denken liegt vielleicht daran das ich ein ziemlich kritischer Mensch bin der allen Scheiss hinterfragt wenn ich es nicht gleich verstehe.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Mit dem Komplizierten denken liegt vielleicht daran das ich ein ziemlich kritischer Mensch bin der allen Scheiss hinterfragt wenn ich es nicht gleich verstehe.

    Ist ja auch gut so. Besser einmahl mehr hinterfrage als dann später dastehen wie du Kuh vorm neuen Tor. ;)

    Am besten du Serialisierst das mal und siehst dir das ergebnis an. Du wirst sehen das die Pläne dem Mitarbeiter zugeordnet sind.

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

    Akanel schrieb:

    Ein Vertriebler kann einen oder mehrere Pläne erstellen, aber jeder Plan hat immer nur einen Vertriebler.
    Das ist, wenn ich es richtig verstanden habe, eine 1:n Beziehung.
    Jo, stimmt - und wie solch in OOP implementiert ist, hat NoFear ja gezeigt:

    VB.NET-Quellcode

    1. Public Class SalesStaff
    2. Public Property Name() As String
    3. Public Property Plans() As New List(Of Plan)
    4. End Class
    Die List(Of Plan)modelliert 1:n (ein SalesStaff hat viele Plans)
    Beachte, dass das eben die OOP-Formulierung einer 1:n-Relation ist - ein OOP-Modell hat nicht alle Möglichkeiten, wie sie ein relationales Model (etwa typDataset) hat.

    Akanel schrieb:

    verstehe leider nicht[...]wie die ID´s verknüpft werden.
    Bei einer OOP-formulierten 1:n gibts keine IDs.
    Wie in Relational Datamodel for Beginners wortreich ausgeführt haben OOP und Relationale Denke da einen fundamentalen Unterschied. Insbesondere kann OOP keine m:n-Relation darstellen, denn ein OOP-Objekt kann nicht gleichzeitig mehreren anderen Objekten untergeordnet sein, weils eben nicht in 2 Auflistungen gleichzeitig liegen kann.
    Kann es natürlich doch, aber nur unter hohem Risiko, Redundanz-bedingte Inkonsistenzen zu erzeugen:

    VB.NET-Quellcode

    1. Public Class Plan
    2. Public Property Name() As String
    3. End Class
    4. Public Class SalesStaff
    5. Public Property Name() As String
    6. Public Property Plans() As New List(Of Plan)
    7. End Class
    8. Public Class Baustelle
    9. Public Property Name() As String
    10. Public Property Plans() As New List(Of Plan)
    11. End Class
    Hier wäre Plan sowohl SalesStaff als auch Baustelle untergeordnet: SalesStaff->Plan<-Baustelle, aber ist wie gesagt heikel damit zu hantieren.

    Akanel schrieb:

    Speichern möchte ich das ganze erstmal als XML
    Jo, mach doch. Füll mal das gezeigte Datenmodell mit paar Datensätzen, und serialisiere.

    Tatsächlich - habich erst neulich gelernt - kann Xml-Serialisierung sowas auch redundanz-frei abbilden, wenn man die Key-Properties durch geeignete Attribute kennzeichnet (hab leider vergessen, welche).
    Das entstehende Xml sieht dann sehr anners aus.

    Also was glaub gut wäre, wenn du dein Model nachwievor im Dataset-Designer konstruierst, und dann denkt man drüber nach, ob und wie es Code-only formulieren.
    OK, nachdem ich mir die ganzen Tutorials und Beiträge nochmals vorgenommen habe bin ich zu folgendem Schluss gekommen.

    Wenn ich maximal 2 Tabellen, oder nur eine 1:n Beziehung habe kann ich OOP nutzen.
    Dieses kann ich dann ohne weiteres Serialisieren oder auch in EF Nutzen. Hier werde ich noch ein Projekt zu Übungszwecken machen, aber scheidet für mich eigentlich schon aus da ich mit relationaler Datenbank angefangen bin (DatasetOnly). Daher habe ich die ID´s vermisst.

    Wenn ich nun aber mehrere Tabellen habe wo auch m:n beziehungen vorkommen geht das mit OOP nicht mehr.
    Dazu muss ich dann ein relationales Datenmodell nutzen (in WPF). Hier kann ich dann allerdings nicht mehr einfach in XML serialisieren und müsste EF CodeFirst nutzen.

    Habe ich das alles soweit richtig verstanden?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Wenn ich nun aber mehrere Tabellen habe wo auch m:n beziehungen vorkommen geht das mit OOP nicht mehr.
    Dazu muss ich dann ein relationales Datenmodell nutzen (in WPF). Hier kann ich dann allerdings nicht mehr einfach in XML serialisieren und müsste EF CodeFirst nutzen.

    Im Grunde schon, ist aber ne frickelei finde ich.

    Aber EF kann ja nicht schaden die Grundkenntnisse zu lernen. Ist ein super Werkzeug und geht verdamm schnell aufzusetzen.

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

    Nachdem ich eine Zwngspause einlegen musste ( defekter Laptop) muss ich das Thema nochmal aufgreifen.
    Ich habe eine List(of Plan) erstellt wie ihr es gesagt habt.
    Allerdings komme ich gerade an meine grenzen wie ich dann im ViewModel Beispieldaten erstellen kann.
    Z.B 5 Vertriebler anlegen und jeder hat nur 2 Pläne. Irgendwie muss doch der Plan "wissen" zu welchem Vertriebler er gehört.

    Anbei mein aktueller Stand
    Dateien
    • HStatistik00.zip

      (43,89 kB, 61 mal heruntergeladen, zuletzt: )
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Akanel schrieb:

    Irgendwie muss doch der Plan "wissen" zu welchem Vertriebler er gehört.

    Naja, jetzt kommt es dann langsam darauf an WIE du später speichern willst. Ich kann EF Core nur empfehlen, aber auch XML ist kein Thema - nur anders.

    Wie in den vorherigen Posts schon besprochen gibt es da unterschiede auch vom Model her. Bei EF ist der Vorteil das diese Back-Properties wie z.b. die Pläne eines Vertrieblers autromatisch gesetzt werden. Wenn man das ganze mit Serialisierung über z.b. XML macht muss man hier tricksen da man ja nur die IDs des Vertrieblers gespeichert werden sollte. Aber da du ja mit einem ViewModel arbeitest ist das insofern dann aber kein problem da du ja dein ViewModel dementsprechend "füllen" kannst das alles wieder so ist wie du es willst, sprich das du die BAck-Properties hast obwohl das Model das nicht hergeben würde. Einer der Vorteile wenn man mit ViewModels arbeitet.

    Bevor ich dir also ein Beispiel mach wäre interessant diese Frage zu klären, sonst wird es wenn du das Model dann umbauen willst/musst verwirrend für Anfänger.

    PS: Du hast hier in deinen Models einen Denkfehler. Obwohl du in der ModelBase ein Eigenschaft "ID" definierst hast du in der jeweiligen Modelklasse auch nochmals die ID drinnen. Unnötigt und kann raus.

    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 erstmal Danke f&uuml;r deinen Beitrag.

    Nofear23m schrieb:

    PS: Du hast hier in deinen Models einen Denkfehler


    Das war kein Denkfehler, ich hatte die ModelBase erst später erstellt, und einfach vergessen die ID´saus den anderen Models herauszunehemn.

    Was lernen wir daraus...Modelbase zuerst und vorher gründlich überlegen welche Eigenschaften alle Models haben sollen.



    Den Denkfehler habe ich wohl bei der herangehensweise des Projektes. Ich hatte mir gedacht ich erstelle das Projekt mit den Models und ViewModels und kann mir damit eine für mich optisch passende View bauen.
    Das ganze war erstmal ohne Datenhaltung gedacht, die wollte ich dann einfach später einbauen.
    Wie ich dann jetzt merke ist das die völlig falsche herangehensweise.
    Also, geplant ist das Projekt mit EF Core, wie du auch schon empfohlen hast. Ich werde nun erstmal das Model komplett überarbeiten, EF Core passend und mich dann nochmal hier melden.
    Dann möchte ich dich bitten da noch mal drüber zu schauen.

    Gruß
    Sven
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Ne, Denkfehler hast du im Grunde keinen. Das ist schon richtig so. Die View hat mit dem Model nix zu tun. Es ist nur so das du im ViewModel etwas mehr arbeit hast wenn das Model zur Datenhaltungsart passt.
    Also wenn das Model für EF zugeschnitten ist anstatt auf XML hast du weniger Arbeit dann im ViewModel die Beziehungen herzustellen.

    OK, mach das und melde ich dich dann eben wieder. Schaffen wir schon.

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

    Anbei dann das überarbeitete Projekt.
    Ich hoffe das passt soweit.,
    Dateien
    • HStatistik00.zip

      (32,7 kB, 56 mal heruntergeladen, zuletzt: )
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    Da ist dir glaube ich was passiert beim hochladen. Es sind keine Model enthalten. :huh:

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