Laden...

Doppelte Datensätze nacherstellen einer "Relation"

Letzter Beitrag vor 11 Jahren 5 Posts 1.393 Views
Doppelte Datensätze nacherstellen einer "Relation"

verwendetes Datenbanksystem: <SQL 2008Express, EF5 und LINQ VS2010>

Hallo Gemeinde,

ich habe folgende Entities:


Public class Man
{
    public int Id {get; set;}
    public string Name {get; set;}
}


Public class Woman
{
    public int Id {get; set;}
    public string Name {get; set;}
}


Public class Pair
{
    public int Id {get; set;}
    public virtual Man Man {get; set;}
    public virtual Woman Woman {get; set;}
}

nachdem ich nun eine neue Instanz von Pair erstellt haben und einen Mann und eine Frau übergeben und die Instanz von Pair an das entsprechende DbSet innerhalb des Context angefügt habe und mit 'SaveChanges' den Vorgang abgeschlossen habe erhalte ich doppelte Einträge für Man und Woman in den jeweiligen Tabellen der DB.

Welchen Fehler begehe ich hier und wie läßt sich dies verhindern.

Viele Grüße

Jürgen

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

Ganz dringend solltest Du Dich mit OOP und OOD beschäftigen - denn so ein Modell-Aufbau, wie Du ihn hast, ist absolut für die Tonne; sorry wenns so direkt ist.

Wenn Du das Lesen, Zuweisen und Schreiben innerhalb eines Contexts macht, und kein falsches Add() im Code hast werden auch keine doppelten Einträge entstehen.
Du hast also irgendeinen Fehler in Deinem Code. Da ich aber aktuell meine Glaskugel nicht hier hab und Du den Code nicht gepostet hast, sehe ich den Fehler aktuell auch nicht.

Hallo Abt,

das ist momentan nur ein Prototype, da ich erst mit der Arbeit mit dem EF begonnen habe.

Der Code für das Hinzufügen des neuen Paares sieht also wie folgt aus:


using (var context = new FamilyContext())
{
   if (pair.Id == 0) //sollte sich das Pair noch nicht in der DB befinden
   {
       Pairs.Add(pair);  //Pairs -> DbSet<Pair> 
       SaveChanges();
    }
    else
   {
        DbEntityEntry entry = Entry(Pairs.Find(pair.Id));
        entry.CurrentValues.SetValues(Pair);
        SaveChanges();
    }
}

Kann ich die beiden Objekte Man und Woman, welche bereits in der Datenbank sind entkoppeln?

Viele Grüße

Jürgen

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

Wenn Du Dich mit Tutorials des EF beschäftigt hast, dann werden Dir Repositories mit Sicherheit bereits etwas sagen.
Wenn Du dann auch noch die Forensuche benutzt hast wirst Du auf etliche Beiträge (viele von mir) treffen, die sich mit dem Repository Pattern und dem EF beschäftigen und auch begründen, wieso man dieses verwenden sollte.

Brauche ich ein Repository?
ASP MVC 3: Invalid Operation Exception beim Einsatz von Data Annotations für Modelvalidierung
Entity Framework (C#) mit mehreren DB Enities

Es würde sich garantiert lohnen, ein Tutorial komplett und sauber durch zu arbeiten. Sauber sieht Dein Vorgehen nicht aus bzw. ist es wohl auch nicht.
Über irgendwelche Entry() Methoden hatte ich damals nie etwas gemacht und CurrentValues traue ich nicht. ein pair.ID == 0 wird wohl auch nicht der zuverlässigste Weg sein. Wenn Du es korrekt innerhalb eines Context machst, dann erkennt er, dass die Entities bereits existieren und fügt sie nicht erneut hinzu.
Da ich aus der Webschiene komme kenne ich hier nur MVCMusicStore und das NerdDinner.

Hallo Abt,

da der "Literatur" zu entnehmen ist, dass EF einen Literal vom Typ int, welcher die Zeichenkette "Id" enthält als PK und 'Identity' annimmt, dachte ich, dass eine Id immer solange 0 ist, solange das Objekt sich noch nicht in der DB befindet, weshalb ich beim Hinzufügen dadrauf prüfe, ob diese 0 ist.

Habe mittlerweile herausgefunden, dass, wenn ich innerhalb einer Klasse die Objekte man/woman 'private' deklariere und über einen separaten DbContext definiere, dass ich dann beim updaten/inserten von die Instanzen von man/woman erst wieder innerhalb der DbContext in welchem die Instanz der Klasse Pair in die Datenbank "geschrieben" werden soll mit den entsprechenden DbSets (Men/Women) mit attach "anbinden" muss um zuverhindern, dass diese erneut und somit als Dubletten in die DB eingefügt werden.
Bei der Instanziierung der Objekte innerhalb des selben DbContext ist dies nicht notwendig.

PS. Danke für die Links

Viele Grüße

Jürgen

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉