EntityFrameworkCore2.0 Löschen funktioniert nicht

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Eine Frage

    Um welche Db handelt es sich?
    Wie ich sehe arbeitest du schon mit 2.0. Kriegst du die DB auch wirklich richtig und komplett gefüllt? Also auch wenn du die Tabellen mit 1:N oder N:M Beziehungen verknüpfst?

    Irgendwie sieht die Funktion OnModelCreating komisch aus.

    Ich hab heute auch mal in die 2.0-Version reingeschaut. Mir ist nur aufgefallen, da muss ein krasser Bug vorhanden sein. auf jedenfall hat er mir die Db nicht korrekt gefüllt.

    Freundliche Grüsse

    exc-jdbi
    Ich nutze den Pomelo MySql Provider.

    An sich hat bis jetzt alles geklappt außer eben das Löschen von Entitäten. Erstellen, Abrufen hat alles funktioniert und die Db wird auch erstellt wenn sie nicht existiert. Ich arbeite mit Migrations. Das Framework ist aber totales Neuland für mich, kenne das ältere auch nicht.
    Mit MySql habe ich noch nicht ausprobiert. Maches jetzt immer noch mit dem SqlServer.
    Ich vermute das es beim füllen der Entitäten ist, kann es aber noch nicht genau sagen, da ich nur eine Stunde versuchshalber damit rumgespielt habe.

    Ich werde mir diese Woche mal die Beziehungen einzel durcharbeiten. Vielleicht habe ich auch was übersehen.

    Freundliche Grüsse

    exc-jdbi
    @seh wie sieht den der code zum löschen aus?
    Und vor allem, welchen Code hast du zum holen der Entität, rufst zu z.b. mit AsNoTracking() kannst du löschen was du willst, er wird die änderung nicht in die DB persistieren.

    Zeig mal den code, dann sehen wir mal.

    PS: du solltest auf die 2.1 gehen, hier wurden viele Bugs bereinigt.

    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 @Nofear23m

    löschen habe ich so versucht:

    C#-Quellcode

    1. var account = DataContext.Accounts
    2. .Where(a => a.UserId == session.User.UserId)
    3. .Include(a => a.AccountHeros)
    4. .FirstOrDefault();
    5. var hero = account.AccountHeros
    6. .Where(h => h.Id == AccountHeroId)
    7. .FirstOrDefault();
    8. if(account.AccountHeros.RemoveAll(h => h.Id == AccountHeroId) == 1)
    9. {
    10. DataContext.Heros.Remove(hero);
    11. DataContext.SaveChanges();
    12. }


    Wenn ich das ganze debugge und mir die Collections anschaue sehe ich auch das sie nicht mehr da sind, nur wird die Änderung nicht in die Datenbank geschrieben.

    Nofear23m schrieb:

    du solltest auf die 2.1 gehen, hier wurden viele Bugs bereinigt.

    Welche meinst du, ich hab mit NuGet aktuell von jedem Package was ich brauche (also EfCore, EfCore.Design, EFCore.Tools und Pomelo.Mysql) die 2.0.1.
    Auch wenn ich Pre-Packages aktiviere ist 2.0.1 die aktuellste. Oder sind die noch nich auf Nuget?
    Hallo

    Warum so umständlich?

    Du hast ja den Hero bereits.
    Es benötigt gar nicht die If Anweisung.

    Einfach: DataContext.Heros.Remove(hero); und dann SaveChanges.

    Aber: SaveChanges gibt die Anzahl der Änderungen zurück. Was gibt es zurück? integer changes = Datacontext.Savechanges();

    EDIT: Sorry, ich meinte 2.0.1. Dachte du bist auf der 2.0.

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

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

    Hallo

    Du benötigst eine Backrelation von Hero zu Account.

    In C# denke ich so: public Account RelatedAccount { get; set; }

    Trotzdem sollte ein Hero aber zu löschen gehen. Warum der ChangeTracker die änderung nicht hinbekommt weis ich nicht, dazu müsste ich mir den Code genauer ansehen. (Den ganzen)
    Ansonsten lade das Projekt mal hoch, bin zwar vb-ler aber das sollte ich in C# auch hinbekommen.

    PS: Wenn du Code einfügst dann mach das bitte mit dem Code Tag. (oben in der Leiste auf C# klicken.)


    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

    Dir ist bewusst das GitHub sowieso öffentlich ist oder? Zumindest ohne das man dafür zahlt.

    Ich habe mir das mal grob angesehen. Soweit solltest du mal das Back-Property zu Account einbauen wie ich oben geschrieben habe. Ich denke daran könnte es liegen.
    Dein Projekt kann ich in der Arbeit hier nicht probieren da ich hier nur VS 2015 zur Verfügung habe und EF Core erst ab Update 3 funktioniert.

    Du benötigst das Property zurück zu Account und musst dieses auch in OnModelCreating angeben. Siehe hier.

    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 Ist mir durchaus bewusst das GitHub public ist :)
    Ich habe nur kein Bock das hier wieder keine hilft weil ein solches Projekt nicht "gern gesehen" ist obwohl das eigentliche Problem nichts mit dem ganzen Projekt zu tun hat. Sieht man hier leider immer wieder.

    Danke ich werde das Property mal einbauen und bissle damit rumspielen. Vielleicht geht es ja dann.

    Edit: Habs probiert:

    C#-Quellcode

    1. modelBuilder.Entity<Hero>()
    2. .HasOne(h => h.Account)
    3. .WithMany(a => a.AccountHeros);


    So sieht jetzt das Model aus.
    Hero hat jetzt einfach noch eine weitere Eigenschaft:

    C#-Quellcode

    1. public Account Account { get; set; }

    Habe die Db komplett gelöscht, Migrations auch, neue Migration und dann ausgeführt. Löscht wieder nicht.

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

    Hallo

    OK. Machen wir es so das es auch im Sinne des Forums ist.

    Du erstellt ein kleines Beipsielprojekt mit irgendwelchen Entitäten mit einer 1:N Relation.
    Das solltest du in 3-5 Minuten fertig haben.

    Das stellst du hier ohne Packages und Bin Ordner ein und dann schau ich mir das gerne mal an. So haben auch die Leute die über z.b. Google hin her kommen was davon.
    Es geht auf jeden Fall, ich habe EF Core bereits länger im Einsatz und bin zufrieden damit. Oft ist es wirklich nur eine kleinigkeit die man übersieht.

    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, das kenne ich.

    Funktioniert es denn wenn den Wert eines Property änderst? Bekommst du dann bei Svachanges > 0 zurück?

    Wenn nicht hast du den Changetracker irgendwo abgeschaltet. Auch ein gern gemachter Fehler ist das die Context-instanz vor dem Speichern neu erstellt wird. Dann weis der context aber nix davon das etwas gelöscht wurde da es bei der änderung des Entitystate nicht dabei war.

    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 @Nofear23m

    Mhh,
    also eigentlich kann das nicht sein. Der Context wird immer neu erstellt wenn er gebraucht wird. Empfange ich also z.B. vom Client das Paket welches dem Server sagt er soll folgenden Helden löschen, wird eine RequestKlasse instanziert, dort erstelle ich dann tatsächlich erst den Context, hole mir den Hero mit seiner Id und versuche den dort dann zu löschen. Kannst du auch in der Repository sehen wenn du in die Datei F...Game\Network\Web\Request\DeleteAccountHeroRequest.cs anschaust. Diese erbt von GameWPDRequest und dort ist der Member DataContext definiert welcher immer DatabaseService.GetContext() aufruft. Und diese Funktion instanziert jedes mal einen neuen Context.