DbUpdateException auf SaveChanges wenn das Kind foreign key bereits vorhanden ist - in Entity Framework Code First
[ Verwendung von Code First DbContext mit Entity Framework 5.0 RC ]
Person mit 2 Navigations-Eigenschaften, /2 Fremdschlüssel
public class Compositon
{
public string Id { get; set; }
public string SimpletonId { get; set; }
[ForeignKey("SimpletonId")]
public Simpleton Simpleton { get; set; }
public string CompanitonId { get; set; }
[ForeignKey("CompanitonId")]
public Companiton Companiton { get; set; }
}
First-Pass - SaveChanges Leeren Datenbank Funktioniert
var composition = new Compositon();
compositon.Id = "UniquePrimaryKey";
var simpleton = new Simpleton();
//This foreign key does not exist in database yet
simpleton.Id = "Simpleton1";
composition.Simpleton = simpleton;
var companiton = new Companiton();
companiton.Id = "SomeOther1";
composition.Companiton = companiton;
//Repositor references the DbContext
Repositor.Compositons.Add(composition);
Repositor.SaveChanges();
Zweiten Durchgang Vorhandene Kind Fremdschlüssel Führt zu Übergeordneten Fault
var composition = new Compositon();
compositon.Id = "AnotherUniquePrimaryKey";
var simpleton = new Simpleton();
//This foreign key already exists in database
simpleton.Id = "Simpleton1";
composition.Simpleton = simpleton;
var companiton = new Companiton();
companiton.Id = "SomeOther2";
composition.Companiton = companiton;
Repositor.Compositons.Add(composition);
Repositor.SaveChanges();
DbUpdateException: An error occurred while updating the entries.
Ich muss in der Lage sein, speichern Sie diese parent-Klassen in der Datenbank, denn Sie sind einzigartig, obwohl Sie enthalten manchmal eine Navigations-Eigenschaft, die bereits gespeichert - wie kann ich die Eltern von diesem Kind Primärschlüssel Konflikt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im zweiten Durchgang müssen Sie zum abrufen der vorhandenen
Simpleton
von derDbContext
. Ich vermute, dass Sie das tun könnten, wie diese:Derzeit, erstellen Sie einen neuen Marke ein, die das Entity Framework versucht, legen Sie als solche, also die key-Verletzung.
var simpleton = Repositor.Simpletons.Find("Simpleton1"); if (simpleton == null) { simpleton = new Simpleton(); simpleton.Id = "Simpleton1"; }
- ich hatte gehofft, dies geschieht automatisch, obwohl, jetzt habe ich dieses Verfahren zu implementieren, so oft wie ich die untergeordneten Eigenschaften ...FirstOrNew(string id)
Erweiterung MethodeIEnumerable<T> where T : IIdentifierOwner, new
und verwenden, statt.IIdentifierOwner
würde eine Zeichenfolge, dieId
Eigentum, das könnte sein hab und eingestellt...