EF - DBContext.ChangeTracker Verständnisfrage

  • C#
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von MasterQ.

    EF - DBContext.ChangeTracker Verständnisfrage

    Hallo

    gegeben sei folgendes, stark verkürztes Beispiel

    C#-Quellcode

    1. class EntityClass
    2. {
    3. public PropertyClass Property {get; set;}
    4. }
    5. class ItemClass
    6. {
    7. public EntityClass Content {get; set;}
    8. }
    9. void Test()
    10. {
    11. ItemClass a = new();
    12. a.Content = MyDBContext.Entities.Irgendeins();
    13. a.Content.Property= JetztAnders;
    14. MyDBContext.SaveChanges();
    15. }


    Die letzte Zuweisung wird vom MyDBContext.ChangeTacker nicht erfasst und dementsprechend mit einem MyDBContext.SaveChanges() nicht in die Datenbank zurückgeschrieben. Warum eigentlich nicht? In a landet doch nur ein Verweis auf die eigentliche Entität, die vom Context und dessen ChangeTracker überwacht werden sollte.

    Wo liegt denn da mein Denkfehler?

    Gruß

    Joachim
    Dieses Beispiel ist nur ein Beispiel, Pseudocode.

    Leider kann ich kein echtes Beispiel mit dem Problem posten. Das wäre ein zu großer Aufwand.

    Ich poste mal ein bissl echten Code. Vielleicht fällt einem was auf.

    Die Methode Rückgabe funktioniert, die Methode Freigabe nicht. Ich sehe da keinen Unterschied

    Spoiler anzeigen


    C#-Quellcode

    1. using libDBHandler.Models;
    2. using System;
    3. using helper = libHelpers.Helpers;
    4. namespace XX.Classes
    5. {
    6. public class OrderOpen
    7. {
    8. private OrderOpenEntity me;
    9. public OrderOpenEntity Content { get { return me; } }
    10. public OrderOpen()
    11. {
    12. me = new();
    13. }
    14. public OrderOpen(OrderOpenEntity e)
    15. {
    16. me = e;
    17. }
    18. public static implicit operator OrderOpenEntity(OrderOpen o) => o.me;
    19. public static explicit operator OrderOpen(OrderOpenEntity e) => new(e);
    20. public int SetFlag(int obj, int flag) => helper.SetFlag(obj, flag);
    21. public int UnsetFlag(int obj, int flag) => helper.UnsetFlag(obj, flag);
    22. public bool IsFlagSet(int obj, int flag) => helper.IsFlagSet(obj, flag);
    23. //public bool IsFlagUnset(int obj, int flag) => helper.IsFlagUnset(obj, flag);
    24. public bool LabHasFinished => IsFlagSet(me.Status, (int)OrderStates.LabHasFinished);
    25. public bool OrderIsRevised => IsFlagSet(me.Status, (int)OrderStates.OrderIsRevised);
    26. public bool ManagerHasApproved => IsFlagSet(me.Status, (int)OrderStates.ManagerHasApproved);
    27. public bool CertificateIsCreated => IsFlagSet(me.Status, (int)OrderStates.CertificateIsCreated);
    28. //public static uint LabHasSigned => (uint)OrdersOpenEntity.Ordere.Statuss.LabHasSigned;
    29. //public static uint ManagerHasSigned => (uint)OrdersOpenEntity.Ordere.Statuss.ManagerHasSigned;
    30. public bool CertificateIsPrinted => IsFlagSet(me.Status, (int)OrderStates.CertificateIsPrinted);
    31. public bool OrderIsClosed => IsFlagSet(me.Status, (int)OrderStates.OrderIsClosed);
    32. public void SetLabHasFinished() { me.Status = SetFlag(me.Status, (int)OrderStates.LabHasFinished); }
    33. public void SetOrderIsRevised() { me.Status = SetFlag(me.Status, (int)OrderStates.OrderIsRevised); }
    34. public void SetManagerHasApproved() { me.Status = SetFlag(me.Status, (int)OrderStates.ManagerHasApproved); }
    35. public void SetCertificateIsCreated() { me.Status = SetFlag(me.Status, (int)OrderStates.CertificateIsCreated); }
    36. public void SetCertificateIsPrinted() { me.Status = SetFlag(me.Status, (int)OrderStates.CertificateIsPrinted); }
    37. public void SetOrderIsClosed() { me.Status = SetFlag(me.Status, (int)OrderStates.OrderIsClosed); }
    38. public void UnsetLabHasFinished() { me.Status = UnsetFlag(me.Status, (int)OrderStates.LabHasFinished); }
    39. public void UnsetOrderIsRevised() { me.Status = UnsetFlag(me.Status, (int)OrderStates.OrderIsRevised); }
    40. public void UnsetManagerHasApproved() { me.Status = UnsetFlag(me.Status, (int)OrderStates.ManagerHasApproved); }
    41. public void UnsetCertificateIsCreated() { me.Status = UnsetFlag(me.Status, (int)OrderStates.CertificateIsCreated); }
    42. public void UnsetCertificateIsPrinted() { me.Status = UnsetFlag(me.Status, (int)OrderStates.CertificateIsPrinted); }
    43. public void UnsetOrderIsClosed() { me.Status = UnsetFlag(me.Status, (int)OrderStates.OrderIsClosed); }
    44. public void ResetState() => me.Status = (int)OrderStates.New;
    45. public override string ToString() => me.AuftragID.ToString();
    46. public int? ApproverID { get => me.FreigabeID; set => me.FreigabeID = value; }
    47. [Flags]
    48. public enum OrderStates
    49. {
    50. New = 0b_0000_0000, // 0x000
    51. LabHasFinished = 0b_0000_0001, // 0x001
    52. OrderIsRevised = 0b_0000_0010, // 0x002
    53. CertificateIsCreated = 0b_0000_0100, // 0x004
    54. ManagerHasApproved = 0b_0000_1000, // 0x008
    55. CertificateIsPrinted = 0b_0001_0000, // 0x010
    56. OrderIsClosed = 0b_0001_0000_0000 // 0x100
    57. }
    58. //public int AuftragID => me.AuftragID;
    59. }
    60. }




    Spoiler anzeigen

    C#-Quellcode

    1. private void Rückgabe()
    2. {
    3. if (SelectedItem != null)
    4. {
    5. //if(!SelectedItem.Leitungfertig)
    6. //if (IsFlagUnset(SelectedItem.Status, ManagerHasApproved))
    7. if (SelectedItem.LabHasFinished)
    8. {
    9. //SelectedItem.UnsetLabHasFinished();
    10. SelectedItem.ResetState();
    11. SelectedItem.SetOrderIsRevised();
    12. controller.SaveChanges();
    13. logger.Info($"Order {SelectedItem} revised by manager");
    14. Refresh();
    15. }
    16. else
    17. {
    18. MessageBox.Show("Vorgang schon freigegeben");
    19. }
    20. }
    21. else
    22. {
    23. err.Set(Properties.Translate.KeinElementAusgewählt, GetType().Name, ErrorHandler.ErrorLevels.Informal);
    24. err.ShowOK();
    25. err.Clear();
    26. }
    27. }
    28. private void Freigabe()
    29. {
    30. if (SelectedItem != null)
    31. {
    32. //var selectedItem = SelectedItem;
    33. using (var cert = new libCertificate.Certificate())
    34. {
    35. //SelectedItem.Content.FreigabeID = operatorsController.Operator.OperatorID;
    36. SelectedItem.ApproverID = operatorsController.Operator.OperatorID;
    37. //controller.SetAsModified(SelectedItem.Content);
    38. controller.SaveChanges();
    39. #if _LOCALDEBUG_
    40. logger.Debug($"FreigabeID: {SelectedItem.Content.Name ?? "N/A"}");
    41. #endif
    42. Mouse.OverrideCursor = Cursors.Wait;
    43. var path = cert.Generate(SelectedItem.Content.AuftragID);
    44. Mouse.OverrideCursor = null;
    45. //item.Status = SetFlag(item.Status, CertificateIsCreated);
    46. logger.Info($"Certificate generated for order {SelectedItem}");
    47. logger.Info($"PDF saved as {path}");
    48. if (!string.IsNullOrEmpty(path))
    49. {
    50. var dialog = new PDFViewerControl(path);
    51. if ((bool)dialog.ShowDialog())
    52. {
    53. SelectedItem.SetManagerHasApproved();
    54. SelectedItem.SetCertificateIsCreated();
    55. // TODO: Manchmal werden die Flags nicht als geändert erkannt
    56. // Abschnitt hier soll Details liefern um Problem einzugrenzen
    57. if (true)
    58. if (!controller.HasChanges(SelectedItem.Content))
    59. {
    60. err.Set("Panik: Entität sollte den Status 'Modified' haben, tut's aber nicht"
    61. + Environment.NewLine + "Checke log Datei für Details"
    62. , GetType().Name, ErrorHandler.ErrorLevels.Critical);
    63. var a = controller.dump(SelectedItem.Content);
    64. a = a.Prepend($"Auftragsstatus: {SelectedItem.Content.Status}").ToList();
    65. foreach (string ss in a)
    66. {
    67. logger.Error(ss);
    68. }
    69. logger.Error("Entität wird der Status 'Modified' zugewiesen");
    70. controller.SetAsModified(SelectedItem.Content);
    71. err.ShowOK();
    72. err.Clear();
    73. }
    74. // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    75. controller.SaveChanges();
    76. cert.PDFUpload(SelectedItem.Content.AuftragID, path);
    77. logger.Info("Certificate accepted");
    78. Refresh();
    79. }
    80. else
    81. {
    82. logger.Info("Certificate rejected");
    83. SelectedItem.Content.FreigabeID = null;
    84. controller.SaveChanges();
    85. Refresh();
    86. }
    87. }//else
    88. {
    89. try
    90. {
    91. File.Delete(path);
    92. }
    93. catch (Exception ex)
    94. {
    95. logger?.Error($"Deleting temporary file failed {ex.Message}");
    96. err.Set(ex.Message, GetType().Name, ErrorHandler.ErrorLevels.Critical);
    97. err.ShowOK();
    98. err.Clear();
    99. }
    100. }
    101. //}
    102. }
    103. }
    104. else
    105. {
    106. err.Set(Properties.Translate.KeinElementAusgewählt, GetType().Name, ErrorHandler.ErrorLevels.Informal);
    107. err.ShowYesNo();
    108. err.Clear();
    109. }
    110. }