MVVM und Daten. Best Practice?

  • WPF MVVM
  • .NET (FX) 4.5–4.8

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

    MVVM und Daten. Best Practice?

    Hey,

    ich bin nun dabei zu überlegen wie ich Datenverarbeitung/Datenansicht am besten in WPF mit MVVM umsetze. In WinForms hatte ich immer ein DataGridView mit DataSet & Co eingesetzt. In WPF hatte ich das bisher mit ObservableCollections und XML-Serialisierung gemacht. Sowohl in WinForms wie auch WPF wird also immer die ganze XML geparst, was bei großen Datenmengen durchaus einen Moment dauert, was ich als negativ empfinde, weil das Programm einen Moment lang nicht ansprechbar ist.

    Da ich nun schon auf modernere Technik umsteige möchte ich da gleich was vernünftiges haben. Ideen hätte ich einige, geht los mit selbst XML partiell einlesen bis hin zur Einbindung einer Datenbank welche ohne Server auskommt(SQLite z.B.).

    Was ist da in WPF angebracht? Was bietet mir das Framework für solche Zwecke? Gibt es da vllt. auch sowas wie Room(für SQLite) in Android, wo man sich die Klassen mit Attributen/Annotationen erstellt und automatisch die DB+Tables generiert werden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    Warum musst du eine serialisierte XML parsen? Wenn du seralisierst, dann hast du doch eine Klasse und darauf aufbauen eine List(Of Klasse) mit deinen Datenobjekten.
    Etwas schneller wäre IMO anstatt XML das ganze mit JSON zu serialisieren. Dann spielt es auch keine Rolle ob du eine JSON sepeicherst oder eine SQLIte-DB-Datei benutzt.
    Also ich selbst parse nicht, es wäre eine Möglichkeit in einem Nebenthread selbst zu parsen um das laden ein wenig schöner hinzubekommen. Ob nun WinForms oder in WPF, in beiden Fällen wird die ganze XML auf einem Schlag eingelesen. Das ist zwar nicht schlimm dauert aber, in WPF könnte ich die Struktur ein wenig ändern, so toll finde ich das aber nicht. Daher möchte ich ja eine Alternative, SQLite wäre schon eine. Aber ich frage in diesem Fall lieber erstmal. Könnte ja sein, das im Framework was gescheites drin ist, wäre auch nicht abgeneigt vom FW zu NET zu wechseln.

    BitBrösel schrieb:

    Gibt es da vllt. auch sowas wie Room(für SQLite) in Android, wo man sich die Klassen mit Attributen/Annotationen erstellt und automatisch die DB+Tables generiert werden?
    Ich kenne ROOM nicht, aber DatenObjekte generieren - sowas wird zB vom EF (EntityFramework) gemacht.
    Ist ein bischen eine Wissenschaft für sich, und ist abhängig von MS-Produkten oder third-party-Produkten.
    Funzt insbesondere am besten im Zusammenspiel mit MS-SqlServer.

    ErfinderDesRades schrieb:

    sowas wird zB vom EF (EntityFramework) gemacht.


    Also der erste Blick bei Wikipedia war viel versprechend, auch wie erwähnt(in Room) mit den Annotationen gibt es im EF, im "Getting Started with EF Core" bei Microsoft, auch direkt SQLite. Das ist durchaus etwas was ich gehofft habe hier zu finden. Klassen mit den Annotationen kommen mir sehr gelegen, Model-Klassen hab ich eh, paar Annotationen hinzufügen und die DB steht abgesehen vom Zugriff auf die Daten schon.
    Hi. @BitBrösel

    Ich kann nur eine bescheidene Empfehlung geben.

    JSON für lokale Settings und so was.

    SQL-Lite im Zusammenspiel mit Dapper (NuGet-Paket).

    Wenn es größer werden soll, dann halt MariaDB/MySQL oder sowas...

    Dapper ist ein Micro-ORM (Object-Relational Mapper) von den Entwicklern von Stack-Overflow und zudem frei und kostenlos.

    Schau nur zwei Operationen (Methoden), wie minimalistisch ist das denn? Voll so Lowcarb und Gasumlage...

    VB.NET-Quellcode

    1. Public Interface IDataAccess
    2. Function LoadData(Of T, TU)(sql As String, parameters As TU, connectionstring As String) As Task(Of List(Of T))
    3. Function SaveData(Of T)(sql As String, parameters As T, connectionstring As String) As Task
    4. End Interface


    Hier ein Ausschnitt der Implementierung

    VB.NET-Quellcode

    1. Public Class MySQLDataAccess
    2. Public Property ConnectionString As String = "Server=localhost;Database=verwaltung;Uid=joshi;Pwd=SuperDuperSafe;SslMode=Preferred;"
    3. Public Property DataAccessor As IDataAccess
    4. Public Sub New()
    5. DataAccessor = New DataAccess
    6. Dapper.SqlMapper.AddTypeMap(GetType(Date), System.Data.DbType.DateTime2) 'Datums Formate hiermit der .NET-Welt verständlich gemacht :)
    7. End Sub
    8. #Region "BetriebDataAccess"
    9. Public Async Function GetBetriebe() As Task(Of List(Of Models.Betrieb))
    10. Dim query As String = "SELECT betriebe.* FROM betriebe"
    11. Return Await DataAccessor.LoadData(Of Models.Betrieb, Object)(query, New Object, ConnectionString)
    12. End Function
    13. Public Async Function InsertBetrieb(betrieb As Models.Betrieb) As Task
    14. Dim query As String = "INSERT INTO verwaltung.betriebe "
    15. query &= "(Name, Strasse, Hausnummer, Ort, Postleitzahl, Land, Ansprechpartner, AnsprechpartnerGeschlecht, Telefonnummer, Faxnummer, EmailAdresse, LoeschungsBlock) "
    16. query &= "VALUES (@Name, @Strasse, @Hausnummer, @Ort, @Postleitzahl, @Land, @Ansprechpartner, @AnsprechpartnerGeschlecht, @Telefonnummer, @Faxnummer, @EmailAdresse, @LoeschungsBlock);"
    17. Await DataAccessor.SaveData(query, betrieb, ConnectionString)
    18. End Function


    Die restlichen CRUD-Dingsies kannste dir selbah (mit "h" wohlgemerkt) zusammen dengeln...

    Falls du Fragen hast oder ein Videomeeting haben möchtest, ich stehe frei.
    Einfach per PM und wir schauen mal wie ich es schaffe in WPF, 300k an Adressen und Verträge in zwei Sekunden auf einem Intel i3 3. Generation mit 8 GB RAM MySQL die Daten abzuluchsen.
    Das ist fast so schnell wie Zuckerberg meine Blutwerte aus den Metadaten ableitet, sowas von Metah (auch mit "h").

    c.u. Joshi :thumbsup:
    Hallo

    Ich kann EF Core auch nur empfehlen, habe ich in fast jedem Projekt in Verwendung und wenn man es mal verstanden hat, ist es nicht nur super easy sondern auch Performant.
    Aber....

    Mit EF muss man sich Beschäftigen, da gibt es einige Fallstricke auch, und man verdaddelt sich dann auch mal schnell. Ich kann nur sagen das sich sich durchaus auszahlt es vorher zu lernen und/oder mal nachzufragen wenn man sich unsicher ist. Das spart einem später im produktiven Einsatz ne menge ärger.

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