Announcement

Collapse
No announcement yet.

Datensatz löschen (Entity Framework)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datensatz löschen (Entity Framework)

    Hallo zusammen,

    ich schaffe es grad einfach nicht, einen bestimmten Datensatz löschen zu lassen.

    Code:
            public static void DeleteItemFromControl(int iControlId)
            {
                    //EntityKey productKey = new EntityKey("icEntities.kontrolle", "id", iControlId);
    
                    kontrolle delItem = new kontrolle
                    {
                        id = iControlId
                    };
    
                    using (icEntities ctx= new icEntities())
                    {
                       ctx.kontrolle.DeleteObject(delItem);
                       ctx.SaveChanges();
    
                        //if (delItem != null)
                        //{
                        //    ctx.Attach(delItem);
                        //    ctx.DeleteObject(delItem);
                        //    ctx.SaveChanges();
                        //}
                    }
    	}
    Fehlermeldung: Objekt kann nicht gelöscht werden, da es nicht im ObjectStateManager gefunden wurde.

    Ich habe es auch, wie hier beschrieben http://msdn.microsoft.com/de-de/libr...eteobject.aspx versucht, allerdings ist mir da nicht ganz klar, was (bei mir) SalesOrderDetails genau ist ...

    Würde mich freuen, wenn mir jemand helfen könnte! Danke!

  • #2
    Hallo,

    so wie im auskommentierten Teil sollte es funktionieren.
    Im anderen Teil kennt der Context das delItem nicht und kann es somit auch nicht löschen.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Um ein Objekt aus der Datenbank zu löschen muss es zuvor auch geladen worden sein. Im Beispiel der von dir verlinkten Hilfe geht das über die TryGetObjectByKey Method .
      Mir ist nicht bewusst das man einfach lokal ein neues Objekt anlegen darf um dann so zu tun als es entspreche es einem Objekt in der Datenbank so wie du es versuchst. (Edit: ObjectContext.Attach scheint das zu ermöglichen wenn der EntityKey passt)

      Ohne dass diesem Objekt zunächst etwas zugewiesen wurde, willst du etwas daraus löschen; das geht natürlich nicht
      Doch icEntities wird der Datenbank Context sein. Der würde beim ersten Zugriff auf ein Element dieses aus der Datenbank nachladen.

      allerdings ist mir da nicht ganz klar, was (bei mir) SalesOrderDetails genau ist
      Im Beispiel ist das einfach eine andere referenzierte Datenmenge von Orders. EF legt ja sogenannte Navigation Properties für referenzierte Tabellen an über die man einfach auf referenzierte Datensätze in anderen Tabellen zugreifen kann. Ohne jetzt blöd mit den Foreign Keys zu jonglieren und sich das Zeug selbst ran holen zu müssen. Wenn dir das eventuell nicht bewusst war stellt sich natürlich die Frage ob dein vorgehen hier so überhaupt nötig ist. Es ist eher ungewöhnlich in EF mit den Key von irgendwas zu hantieren sondern man nimmt findet eigentlich von einem Objekt zum nächsten über die besagten Navigation Properties (und ein wenig LINQ) zu dem Object das einen wirklich interessiert.
      Zuletzt editiert von Ralf Jansen; 08.11.2012, 13:23.

      Comment


      • #4
        Originally posted by Ralf Jansen View Post
        EF legt ja sogenannte Navigation Properties für referenzierte Tabellen an über die man einfach auf referenzierte Datensätze in anderen Tabellen zugreifen kann. Ohne jetzt blöd mit den Foreign Keys zu jonglieren und sich das Zeug selbst ran holen zu müssen. Wenn dir das eventuell nicht bewusst war stellt sich natürlich die Frage ob dein vorgehen hier so überhaupt nötig ist.
        Nein, das war mir nicht bewusst ... und um ehrlich zu sein, ich weiß auch nicht wie ich das umsetzen soll?
        Ist der Weg, den ich wie oben versucht habe "falsch"?

        Ohne .Attach erhalte ich die Fehlermeldung: Objekt kann nicht gelöscht werden, da es nicht im ObjectStateManager gefunden wurde.
        Was mir nun klar ist - danke für die Info im vorigen Post!

        Mit .Attach kommt die Fehlermeldung: Ein Objekt mit einem Null-Wert als EntityKey-Wert kann nicht an einen Objektkontext angefügt werden.
        Allerdings ist mein Key nicht null - Key = id; Value = 35 (=iControlId)

        Comment


        • #5
          Nun klappt es - ganz simpel und einfach (@Ralf Jansen: vermutlich so, wie du gemeint hast)

          Code:
              public static void Delete(int Id)
                  {
                      using (icEntities ctx = new icEntities())
                      {
                          kontrolle control = ctx.kontrolle.First(c => c.id == Id);
                          ctx.DeleteObject(control);
                          ctx.SaveChanges();
                      }
                  }

          Comment


          • #6
            Hallo,

            od. durch ein Attach - wie im auskommentierten Code oben.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Was ich meinte wahr eigentlich das ich mich wundere das du einfach eine ID hast mit der du die Methode aufrufen kannst und keine Entität. Die ID hat sich ja zur Laufzeit bestimmt kein User ausgedacht sondern die kommt irgendwo her. Wahrscheinlich aus einer anderen Entität. Diese andere Entität hat dann im günstigsten Fall eine Property (z.B hieße die Kontrolle) weil es eine Referenz zwischen diesen Tabellen gab und du hättest da bereits das zu löschende Object direkt an der Hand ohne dir irgendwie manuell das Object über die ID ranholen zu müssen. Die ID sollte eigentlich irrelevant. Zumindest habe ich den Primärschlüssel bei der Programmierung für die Standardaufgaben nie direkt gebraucht.

              Comment

              Working...
              X