Problem beim Serializieren der Klassen im Context

  • WPF

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

    Problem beim Serializieren der Klassen im Context

    Hallo,
    ich benutze die XmlSerializer Klasse von @Nofear23m um meine Klassen in XML zu serialiseren.

    Leider erhalte ich einen Fehler, den ich nicht nachvollziehen kann.
    Vielleicht erst kurz zum Aufbau.
    Das Model Projekt ist .Net Standard 2.0
    Das Context Projekt ist ebenfalls .Net Standard 2.0 und verweist auf das Model Projekt
    das WPF Programm verweist auf ViewModel (.Net Frameweork) und Context.
    Nun möchte ich beim Starten, den Context laden und hier knallt es dann mit dieser Fehlermeldung:

    XML-Quellcode

    1. System.Exception
    2. HResult=0x80131500
    3. Nachricht = Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Context.XmlContext'.
    4. Quelle = Bazaar.Context
    5. Stapelüberwachung:
    6. bei de.mhoapps.Bazaar.Context.XMLSerializer.DeSerialize[T](String path, T defaultInstance) in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\XMLSerializer.cs: Zeile79
    7. bei de.mhoapps.Bazaar.Context.BazaarXmlContext.LoadContext() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\BazaarXmlContext.cs: Zeile86
    8. bei de.mhoapps.Bazaar.Context.BazaarXmlContext..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\BazaarXmlContext.cs: Zeile16
    9. bei de.mhoapps.Bazaar.ViewModel.MainViewModel..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\ViewModel\Bazaar.ViewModel\MainViewModel.cs: Zeile18
    10. bei de.mhoapps.Bazaar.CashRegister.MainWindow..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Application\Bazaar.CashRegister\MainWindow.xaml.cs: Zeile29
    11. Innere Ausnahme 1:
    12. InvalidOperationException: Fehler beim Reflektieren der Eigenschaft 'Events'.
    13. Innere Ausnahme 2:
    14. InvalidOperationException: Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Model.EventModel'.
    15. Innere Ausnahme 3:
    16. FileNotFoundException: Die Datei oder Assembly "System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.


    hier mal die entsprechenden Klassen dazu:
    Serializer

    C#-Quellcode

    1. /// <summary>
    2. /// ''' Der XMLSerializer serialisiert eine beliebige Klasse welche auch Primitiven Datentypen oder solchen welche als Serialisiert gekennzeichnet sind
    3. /// ''' Klasse ist generisch aufgebaut und gibt die selbe Type von Klasse zurück welche ihm übergeben wird.
    4. /// ''' </summary>
    5. public class XMLSerializer
    6. {
    7. /// <summary>
    8. /// Der XMLSerializer serialisiert eine beliebige Klasse welche auch Primitiven Datentypen oder solchen welche als Serialisiert gekennzeichnet sind
    9. /// Klasse ist generisch aufgebaut und gibt die selbe Type von Klasse zurück welche ihm übergeben wird.
    10. /// </summary>
    11. public void Serialize<T>(string path, T instance)
    12. {
    13. try
    14. {
    15. string dirName = Path.GetDirectoryName(path);
    16. if (!Directory.Exists(dirName))
    17. Directory.CreateDirectory(dirName);
    18. File.Delete(path);
    19. using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
    20. {
    21. SaveToStream(fs, instance);
    22. }
    23. }
    24. catch (Exception ex)
    25. {
    26. throw new Exception(ex.Message, ex.InnerException);
    27. }
    28. }
    29. /// <summary>
    30. /// Serialisiert eine Klasse über einen Stream
    31. /// </summary>
    32. /// <typeparam name="T">Den Klassentyp angeben</typeparam>
    33. /// <param name="s">Der Stream welcher die Daten enthält (Filestream, MemoryStream,...)</param>
    34. /// <param name="o">Die Instanz der Klasse welche serialisiert werden soll</param>
    35. public void SaveToStream<T>(Stream s, T o)
    36. {
    37. try
    38. {
    39. System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
    40. x.Serialize(s, o);
    41. }
    42. catch (Exception ex)
    43. {
    44. throw new Exception(ex.Message, ex.InnerException);
    45. }
    46. }
    47. /// <summary>
    48. /// Deserialisiert eine XML in eine Klasseninstanz - Die Instanz muss also nicht erstellt sein.
    49. /// </summary>
    50. /// <typeparam name="T">Der Typ der Klasse welche erwartet wird.</typeparam>
    51. /// <param name="path">Der Pfad zur XML-Datei inkl. Dateiendung</param>
    52. /// <param name="defaultInstance">Die Instanz der Klasse falls die Datei noch nicht Existiert oder nicht gefunden werden kann</param>
    53. /// <returns>Gibt die Deserialissierte Klasse zurück</returns>
    54. public T DeSerialize<T>(string path, T defaultInstance)
    55. {
    56. try
    57. {
    58. if (!File.Exists(path))
    59. {
    60. return defaultInstance;
    61. }
    62. using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
    63. {
    64. return LoadFromStream<T>(fs);
    65. }
    66. }
    67. catch (Exception ex)
    68. {
    69. throw new Exception(ex.Message, ex.InnerException);
    70. }
    71. }
    72. /// <summary>
    73. /// Läd ein Klasse generisch über einen Stream, Methode ist gut geeignet für UnitTests
    74. /// </summary>
    75. /// <typeparam name="T">Der Typ der Klasse welche erwartet wird</typeparam>
    76. /// <param name="s">Der Stream welcher die Daten enthält (Filestream, MemoryStream,...)</param>
    77. /// <returns>Gibt die Deserialisierte Klasse zurück</returns>
    78. public T LoadFromStream<T>(Stream s)
    79. {
    80. System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
    81. return (T)x.Deserialize(s);
    82. }
    83. }


    Context

    C#-Quellcode

    1. public class BazaarXmlContext : ContextBase, IDisposable
    2. {
    3. private readonly string _xmlpath;
    4. private XmlContext CurrentContext { get; set; }
    5. public BazaarXmlContext()
    6. { _xmlpath = AppDomain.CurrentDomain.BaseDirectory + @"\BazaarData.xml";
    7. LoadContext();
    8. }
    9. public BazaarXmlContext(string xmlpath)
    10. {
    11. if (!Directory.Exists(Path.GetDirectoryName(xmlpath))) throw new Exception("Der Pfad zum XML-Datendateiordner existiert nicht.");
    12. _xmlpath = xmlpath;
    13. LoadContext();
    14. }
    15. internal event ErrorMessageSentEventHandler ErrorMessageSent;
    16. internal delegate void ErrorMessageSentEventHandler(string message);
    17. #region Context Properties
    18. public ObservableCollection<EventModel> Events => CurrentContext.Events;
    19. public ObservableCollection<PersonModel> Persons => CurrentContext.Persons;
    20. public ObservableCollection<ArticleModel> Articles => CurrentContext.Articles;
    21. #endregion
    22. #region Methods
    23. public void Seed()
    24. {
    25. //Organizer und Responsible anlegen
    26. PersonModel organizer = new PersonModel() {ID = 1, FullName = "Förderverein KiTa Kunterbunt e.v.", PersonType = PersonTypeEnum.Organizer, License = LicenseTypeEnum.Free };
    27. PersonModel responsible = new PersonModel() {ID = 2, FullName = "Harald Muster", Email = "harald@muster.com", PersonType = PersonTypeEnum.Responsible };
    28. // wenn der Responsible gleichzeitig auch Verkäufer ist, dann PersonType auf ResponsibleSeller setzen
    29. //PersonModel responsible = new PersonModel() { ID = 2, FullName = "Harald Muster", Email = "harald@muster.com", PersonType = PersonTypeEnum.ResponsibleSeller };
    30. //Events anlegen
    31. EventModel eventI = new EventModel() { ID = 1, EventName = "Kleiderbasar Musterhausen", EventDate = DateTime.Now.AddDays(14), OrganizerID = organizer.ID, ResponsiblePersonID = responsible.ID };
    32. EventModel eventII = new EventModel() { ID = 2, EventName = "Grillfeier KiTahausen", EventDate = DateTime.Now.AddDays(14), OrganizerID = organizer.ID, ResponsiblePersonID = responsible.ID };
    33. //Seller anlegen
    34. PersonModel sellerI = new PersonModel() { ID = 3, FullName = "Maria Muster", SellerNumber = 1, PersonType = PersonTypeEnum.Seller,
    35. PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventI.ID } } };
    36. PersonModel sellerII = new PersonModel() { ID = 3, FullName = "Helga WatWeisIch", SellerNumber = 2, PersonType = PersonTypeEnum.Seller,
    37. PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventII.ID } }};
    38. PersonModel sellerIII = new PersonModel() { ID = 3, FullName = "Irmtraut HasteNichtGesehen", SellerNumber = 3, PersonType = PersonTypeEnum.Seller,
    39. PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventII.ID } }};
    40. if (!Persons.Any())
    41. {
    42. Persons.Add(organizer);
    43. Persons.Add(responsible);
    44. Persons.Add(sellerI);
    45. Persons.Add(sellerII);
    46. Persons.Add(sellerIII);
    47. }
    48. if (!Events.Any())
    49. {
    50. Events.Add(eventI);
    51. Events.Add(eventII);
    52. }
    53. if (!Articles.Any())
    54. {
    55. Articles.Add(new ArticleModel() { ArticleNumber = 123, Description = "Spiel - Schnappt Hubi", Price = 2.5m, Quantity = 1, PersonID = sellerI.ID });
    56. Articles.Add(new ArticleModel() { ArticleNumber = 456, Description = "türkisblaue Jacke", Price = 5, Quantity = 1, PersonID = sellerIII.ID });
    57. Articles.Add(new ArticleModel() { ArticleNumber = 789, Description = "bunte Hose", Price = 0.5m, Quantity = 1, PersonID = sellerII.ID });
    58. Articles.Add(new ArticleModel() { ArticleNumber = 1011, Description = "Häßliche Mütze", Price = 25, Quantity = 1, PersonID = sellerIII.ID });
    59. Articles.Add(new ArticleModel() { ArticleNumber = 1012, Description = "Jacke", Price = 2, Quantity = 1, Size = "140/146", PersonID = sellerI.ID });
    60. Articles.Add(new ArticleModel() { ArticleNumber = 1013, Description = "Hose", Price = 4, Quantity = 1, PersonID = sellerII.ID });
    61. Articles.Add(new ArticleModel() { ArticleNumber = 1014, Description = "Turnhose", Price = 1, Quantity = 2, PersonID = sellerIII.ID });
    62. Articles.Add(new ArticleModel() { ArticleNumber = 1015, Description = "Kaufladen mit Zubehör", Price = 25, Quantity = 1, PersonID = sellerI.ID });
    63. }
    64. SaveChanges();
    65. }
    66. internal void LoadContext()
    67. {
    68. XMLSerializer xser = new XMLSerializer();
    69. CurrentContext = xser.DeSerialize<XmlContext>(_xmlpath, new XmlContext());
    70. }
    71. public bool SaveChanges()
    72. {
    73. try
    74. {
    75. XMLSerializer ser = new XMLSerializer();
    76. ser.Serialize<XmlContext>(_xmlpath, CurrentContext);
    77. return true;
    78. }
    79. catch (Exception ex)
    80. {
    81. ErrorMessageSent?.Invoke(ex.Message);
    82. return false;
    83. }
    84. }
    85. #endregion
    86. #region IDisposable
    87. private bool _disposedValue;
    88. protected virtual void Dispose(bool disposing)
    89. {
    90. if (!_disposedValue)
    91. {
    92. if (disposing)
    93. {
    94. CurrentContext = null;
    95. }
    96. }
    97. _disposedValue = true;
    98. }
    99. public void Dispose()
    100. {
    101. Dispose(true);
    102. }
    103. #endregion
    104. }
    105. #region XmlContext Class
    106. [Serializable]
    107. public class XmlContext : ContextBase
    108. {
    109. public XmlContext()
    110. {
    111. Events = new ObservableCollection<EventModel>();
    112. Persons = new ObservableCollection<PersonModel>();
    113. Articles = new ObservableCollection<ArticleModel>();
    114. }
    115. private ObservableCollection<EventModel> _allEvents;
    116. public ObservableCollection<EventModel> Events
    117. {
    118. get { return _allEvents; }
    119. set { _allEvents = value; RaisePropertyChanged(); }
    120. }
    121. private ObservableCollection<PersonModel> _allPersons;
    122. public ObservableCollection<PersonModel> Persons
    123. {
    124. get { return _allPersons; }
    125. set { _allPersons = value; RaisePropertyChanged(); }
    126. }
    127. private ObservableCollection<ArticleModel> _allArticles;
    128. public ObservableCollection<ArticleModel> Articles
    129. {
    130. get { return _allArticles; }
    131. set { _allArticles = value; RaisePropertyChanged(); }
    132. }
    133. }
    134. #endregion


    EventModel

    C#-Quellcode

    1. [Serializable]
    2. public class EventModel : ModelBase
    3. {
    4. public EventModel()
    5. {
    6. MaxSellerNumber = (int)LicenseTypeEnum.Free;
    7. }
    8. public EventModel(LicenseTypeEnum licenseType)
    9. {
    10. MaxSellerNumber = (int)licenseType;
    11. }
    12. [Key]
    13. public virtual int ID { get; set; }
    14. [Required(AllowEmptyStrings =false,ErrorMessage ="Die Veranstaltung muss benannt werden.")]
    15. public virtual string EventName { get; set; }
    16. [Required(ErrorMessage ="Sie müssen das Veranstaltungsdatum angeben.")]
    17. public DateTime EventDate { get; set; }
    18. //kann und darf leer sein (eventuell über Settings bool Variable auf Required setzen?
    19. public virtual double Provision { get; set; }
    20. //kann und darf leer sein (eventuell über Settings bool Variable auf Required setzen?
    21. public virtual decimal MinProvision { get; set; }
    22. //wird in der Datenbank gesetzt anhand der Lizenz (siehe LicenseTypeEnum)
    23. public virtual int MaxSellerNumber { get;}
    24. public virtual int OrganizerID { get; set; }
    25. public virtual PersonModel Organizer { get; set; }
    26. public virtual int ResponsiblePersonID { get; set; }
    27. public virtual PersonModel ResponsiblePerson { get; set; }
    28. public virtual ICollection<PersonEventModel> Sellers { get; set; }
    29. }



    Kann mir jemand sagen was da das Problem ist?
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."

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

    Hallo @MichaHo

    Sehe ich das richtig das du versuchst die Klasse "Context" zu serialisieren?
    Das wird nicht klappen. Es können nu Klassen serialisiert werden welche als Serializable gekenntzeicht sind und nur Datentypen enthalten welche Serialisiert werden können.
    Context enthält Events, welche gleuabe ich nicht serialisierbar sind.

    Es ist denke auch nicht das es klug ist alles auf einmal zu serialisieren.

    Guck dir mal das DataService von @flori2212 an. Er arbeitet auch mit XML Serialisierung, das klappt auch gut und ist einfach und übersichtlich implementiert.

    PS: Bitte die richtigen CodeTags verwenden damit der Quellcode leserlich wird.

    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 Sascha,
    Danke Dir für die Info, schaue ich mir an.
    CodeTags hatte ich wegen dem Spoiler vergessen, ist nun geändert.
    eigentlich will ich die XmlContext Serialisieren, die hält ja die Models als ObservableCollection

    C#-Quellcode

    1. [Serializable]
    2. public class XmlContext : ContextBase
    3. {
    4. public XmlContext()
    5. {
    6. Events = new ObservableCollection<EventModel>();
    7. Persons = new ObservableCollection<PersonModel>();
    8. Articles = new ObservableCollection<ArticleModel>();
    9. }
    10. private ObservableCollection<EventModel> _allEvents;
    11. public ObservableCollection<EventModel> Events
    12. {
    13. get { return _allEvents; }
    14. set { _allEvents = value; RaisePropertyChanged(); }
    15. }
    16. private ObservableCollection<PersonModel> _allPersons;
    17. public ObservableCollection<PersonModel> Persons
    18. {
    19. get { return _allPersons; }
    20. set { _allPersons = value; RaisePropertyChanged(); }
    21. }
    22. private ObservableCollection<ArticleModel> _allArticles;
    23. public ObservableCollection<ArticleModel> Articles
    24. {
    25. get { return _allArticles; }
    26. set { _allArticles = value; RaisePropertyChanged(); }
    27. }
    28. }

    Ich glaube fast, das meine Models, die ich ja per EF in die DB schreibe, nicht gleichzeitig auch serialisiert werden können.
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Ich frage mich auch warum. Entweder ich habe eine DB oder ich Serialisiere. Ein Model welches für eine Relationale Datenbank aufgebaut ist, ist auch denkbar schlecht für XML geeignet. Wie regelst du denn das mit den NavigationProperties?

    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 ich muss doch serialisieren, denn die Kasse funktioniert ja nur offline, also muss ich die Daten ja irgendwo haben. Oder ich muss bei der Kasse mit LocalDB arbeiten
    ich hab halt heute die Kasse soweit fertig gemacht und wollte es mit paar Daten testen. Die Daten werden ja online eingegeben und werden dann herunter geladen und zur Kasse gelegt, die Kasse liest die Daten ein und die Artikel können verkauft werden.
    "Hier könnte Ihre Werbung stehen..."
    Zwei möglichkeiten. LocalDB oder Serialisierung. Dafür muss ein Model aber anders aufgebaut werden als für eine Datenbank.

    Bei Serialisierung:
    1. Darfst du für die NavigationProperties nur mit IDs Arbeiten und nicht mit den Objekten selbst da diese sonst mitserialisiert werden wodurch eine inkonsistenz entsteht.
    2. Solltest du IDs vom Typ GUID verwenden.

    Und der Datenabruf ist weder flexibel noch performant.

    Entscheide dich für eine Art des Abrufs und stelle das Model dahingehend ein.
    Gerne Helfe ich dir dabei.

    PS: Mein Favorit ist immer eine DB.

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

    dann werde ich neben der online MSSQL DB noch eine localDB verwenden.
    Die Daten (Artikel) müssen definitiv offline zur Verfügung stehen.
    Beim Programmstart die Daten einmal abrufen geht nicht, da kein Internet zur Verfügung steht.
    Jenachdem wieviele Kassen benötigt werden, brauch ich dann auch mehrere LocalDB auf den verschiedenen Rechnern.
    Und hinterher muss es zusammengeführt werden.
    Dann hab ich morgen wieder etwas umbauten vor mir :)
    "Hier könnte Ihre Werbung stehen..."
    Hallo nochmals

    Ich verstehe ja was du willst. Ein Model für beides. Das wäre ja auch möglich, ist aber wie gesagt eine frikelei. Wenn ein Model für ein relationelles Datenmodell "optimiert" ist ist es eben NICHT für die Serialisierung optimiert.
    Man könnte es Seriealisieren aber das macht keinen spaß.

    Da es lokale Datenbanken gibt finde ich es auch immer schöner mit ner DB. Auch hier kann man Import/Export Funktionen schreiben oder Backups machen.

    MichaHo schrieb:

    Beim Programmstart die Daten einmal abrufen geht nicht, da kein Internet zur Verfügung steht.

    Wie willst du den Sync machen? Nur wenn Internet beim start zur Verfügung steht? Oder rein über Import/Export Prozeduren?


    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,
    der Sync muss über Import/Export funktionieren, sprich, wenn die Veranstaltung rum ist, müssen die LocalDB von den Kassen zum Responsible (über USB-Stick) und werden dann im Hauptprogramm importiert.
    Das Hauptprogramm muss Internet haben.
    "Hier könnte Ihre Werbung stehen..."
    Dann darfst du dich aber schon mal darauf einstellen das du hier eine Strategie benötigst um zu prüfen welche Daten neu und welche geändert sind.

    Es könnte ja jemand die Daten am "Responsible" in der zwischenzeit bearbeitet haben. Jetzt kommst du mit nem USB Stick und Bügelst einfach drüber?
    Nicht so gut. Du benötigst eine Strategie um hier auch Syncronisationskonflikte lösen zu können.

    Welche "Teile" des gesamten Models soll die Kasse dann im Endeffekt verwenden? Ich denke das ist nicht viel oder?

    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,
    im Grunde verwendet die Kasse ja nur die ArticleModel Klasse.
    Und benötigt eigentlich nur eine Zuordnung zur Veranstaltung.
    Die Veranstaltung kennt ja seinen Responsible und seine Seller und der Artikel kennt auch seine Seller.

    In der WinForms arbeite ich noch mit einer Klasse Item, um über einen KassenBon dem Käufer zu sagen was er zahlen muss.
    die typDataSets werden dann am Ende gemerged anhand der ArtikelID und ob sie verkauft sind.
    sieht so aus:

    C#-Quellcode

    1. private void btnMerge_Click(object sender, EventArgs e)
    2. {
    3. DataSet ds2Merge = dsCore.Clone();
    4. using (OpenFileDialog ofd = new OpenFileDialog() { InitialDirectory = Application.StartupPath + @"\Datenbank\" })
    5. {
    6. if (ofd.ShowDialog() != DialogResult.OK) return;
    7. ds2Merge.LoadDataSet(new FileInfo(ofd.FileName));
    8. }
    9. DataRow[] mergeRow = ds2Merge.Tables["Article"].Select("Sold = true");
    10. foreach (DataRow rw in mergeRow)
    11. {
    12. dsCore.Article.UpdateSoldArticle((dsCore.ArticleRow)rw);
    13. }
    14. dsCore.AcceptChanges();
    15. }

    und in der dsCore (DataSet) ArticleDataTable Klasse:

    C#-Quellcode

    1. public void UpdateSoldArticle(ArticleRow rw)
    2. {
    3. foreach (var item in this)
    4. {
    5. if (item.ArticleID == rw.ArticleID)
    6. item.Sold = rw.Sold;
    7. }
    8. }
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Wenn es denn nicht mehr ist was am Ende Serialisiert/Importiert/Exportiert wird dann macht es ja sinn nur dies Klasse zu seialisieren oder?
    Dann kommst du ohne DB aus. Also nur eine List(Of ArticleModel) und diese Synct man hin und her. Sollte den Aufwand minimieren.

    Man muss zwar auch kontrollieren ob es konflikte gibt, aber das ist in diesem Fall ein recht überschaubarer Aufwand.

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

    Da für Entity Famework ja empfohlen ist das man bei NavigationProperties sowohl die ID mit drinnen hat als auch die Navogation selbst kannst du es mit XMLIgnore Annotieren.

    Also:

    VB.NET-Quellcode

    1. Public Class ArticleModel
    2. Public Property ID As Integer
    3. Public Property ArticelName as String
    4. Public Property PersonId as Integer
    5. <XmlIgnore>
    6. Public Property Person as PersonModel
    7. End Class


    So dürfte beim serialisieren die Eigenschaft "Person" ausgeschlossen werden. Probiers mal.

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

    ich glaub irgendwas hat sich in meinem ganzen Projekt zerschoßen...

    XML-Quellcode

    1. System.Windows.Markup.XamlParseException
    2. HResult=0x80131501
    3. Nachricht = Zeilennummer "8" und Zeilenposition "9" von "Durch den Aufruf des Konstruktors für Typ "de.mhoapps.Bazaar.CashRegister.MainWindow", der den angegebenen Bindungseinschränkungen entspricht, wurde eine Ausnahme ausgelöst.".
    4. Quelle = PresentationFramework
    5. Stapelüberwachung:
    6. bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
    7. Innere Ausnahme 1:
    8. Exception: Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Context.XmlContext'.
    9. Innere Ausnahme 2:
    10. InvalidOperationException: Fehler beim Reflektieren der Eigenschaft 'Articles'.
    11. Innere Ausnahme 3:
    12. InvalidOperationException: Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Model.ArticleModel'.
    13. Innere Ausnahme 4:
    14. FileNotFoundException: Die Datei oder Assembly "System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

    ArticleModel sieht so aus:

    C#-Quellcode

    1. [Serializable]
    2. public class ArticleModel : ModelBase
    3. {
    4. [Key]
    5. public virtual int ID { get; set; }
    6. //soll automatisch vergeben werden (Format: Sellernumber+fortlaufende Nummer)
    7. [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    8. public virtual int ArticleNumber { get; set; }
    9. [Required(AllowEmptyStrings =false,ErrorMessage ="Artikelbezeichnung muss angegeben werden!")]
    10. [MinLength(3,ErrorMessage ="Geben Sie mindestens 3 Zeichen ein")]
    11. [MaxLength(100,ErrorMessage ="Es Artikelbeschreibung darf höchstens 100 Zeichen beinhalten")]
    12. public virtual string Description { get; set; }
    13. [Required(ErrorMessage ="Preis muss angegeben werden!")]
    14. public virtual decimal Price { get; set; }
    15. public virtual string Size { get; set; }
    16. public virtual int Quantity { get; set; } = 1;
    17. public virtual bool Sold { get; set; }
    18. public virtual int PersonID { get; set; }
    19. [XmlIgnore]
    20. public virtual PersonModel Person { get; set; }
    21. }
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Steht doch da....
    Die Datei oder Assembly "System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.


    Beim App-Projekt selbst (die exe) binde auch das NuGet Paket ein.

    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, aber verstehe es nicht.
    Ich habe in allen .NetStandard Projekten (Model, Context) über NuGet die System.ComponentModel.Annotations (4.5.0) hinzugefügt.
    In allen .Net Framework Projekt nun auch den Verweis auf System.ComponentModel.DataAnnotations gesetzt.
    im Debug Ordner ist tatsächlich keine System.ComponentModel.DataAnnotations drin, da kann ich bereinigen und neu erstellen wie ich will...
    "Hier könnte Ihre Werbung stehen..."
    Du benötigst im Startprojekt das Nuget Paket nicht den Verweis.

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