Fremdschlüssel in Entity Framework nicht richtig aktualisiert
Ich habe ein Problem mit foreign key-Beziehungen im entity framework. Ich habe zwei Tabellen: Persons
und Countries
. Persons
hat eine foreign-key-Spalte zu CountryId
.
Als Countries
Tabelle selten ändert, ich möchte zu Holen Ihre Daten nur einmal, entsorgen Sie die DatabaseContext
, und halten Sie die Liste der Countries
irgendwo zwischengespeichert. Dies ist, wo habe ich Probleme.
Entity framework scheint zu wollen, dass Sie eine Datenbank öffnen, Rahmen, hinzufügen/Bearbeiten von Zeilen wie nötig, und schließen Sie dann die Datenbank-Kontext. Wenn Sie öffnen, abrufen von Daten, schließen; und dann später öffnen, Daten speichern, schließen; er hat Schwierigkeiten.
Also meine POCO-Objekte wie folgt Aussehen:
public class Country {
public int CountryId {get; set; }
public String Name {get; set; }
}
public Person {
public int PersonId {get; set; }
public virtual Country Country {get; set; }
}
Dann versuche ich eine neue person wie diese:
Country[] countries;
using (var dt = new DatabaseContext())
{
countries= dt.Countries.ToArray();
}
Person person = new Person();
person.Country = countries[0];
using (var dt = new DatabaseContext()) {
dt.Entities.Add(person);
dt.SaveChanges();
}
Auf speichern, entity framework erstellt eine neue Zeile in der Countries
Tabelle mit dem gleichen Namen wie countries[0]
, aber eine neue, erhöhte ID. Dies ist offensichtlich nicht das gewünschte Ergebnis - die person sollte seine Country_CountryId
Feld auf die id des countries[0]
, und eine neue Zeile sollte nicht erstellt werden.
Wie löse ich dieses? Ich denke eine Lösung wäre die Kraft, die das entity framework nicht erstellen Sie eine neue Zeile, wenn er ein Objekt, das schon dem Primärschlüssel gesetzt. Gibt es eine Möglichkeit, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Frage mich, wenn man wenigstens die Suche etwas im Internet, bevor Sie in ziemlich großer Aufwand, um das Problem zu beschreiben, denn dies ist sehr häufiges problem, fragte alle paar Tage.
Add
Methode fügt alle Entitäten im entity graph. Also, wenn Sie eine Verbindungcountry
zuperson
undcountry
ist nicht an den aktuellen Kontext, ruftAdd
auf dieperson
markieren beideperson
undcountry
als neue Einheiten einfügen. Wenn Sie nicht möchten, dasscountry
eingefügt werden, Sie müssen sagen, dass EFcountry
ist nicht eine neue Einheit:EntityState.Modified
für jedes Kind entity - ich glaube, das wird zu Problemen führen, und bricht die Kapselung. Gibt es eine Möglichkeit zum abfangenAdd
an der Stelle, wo er befestigt die unberührte Objekte?Add
Methode nicht abgefangen werden können. Es selbst kann nicht überschrieben werden, denn es ist nicht virtuell.Person
enthält Verweise zu 5 verschiedenen Ländern, einige Arten, Beziehungs-Definitionen und so weiter. SchreibenEntityState.Modified
für alle diese würde viele Zeilen code, und schlimm wäre zu warten. Jedoch, ich kann nicht glauben, die bessere Lösung.State
Eigenschaft. Durch die Implementierung dieser Schnittstelle in jeder Entität und mit derState
Eigenschaft in der Anwendung der Logik werden Sie in der Lage, korrekt anzugeben, die auf alle Objekte innerhalb einer Schleife in überschriebenSaveChanges
.Ich habe dieses problem gelöst, indem wir die folgenden zwei Methoden, um meine
DatabaseContext
Klasse:Add
Methode funktioniert, aberModify
nicht.