DbUpdateException en SaveChanges si la key externa infantil ya existe – en el código de Entity Framework primero

[ Usando Code First DbContext con Entity Framework 5.0 RC ]

Entidad con 2 properties de navigation / 2 keys externas

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; } } 

Primer pase – SaveChanges para vaciar la database funciona

 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(); 

Segundo pase: la key externa infantil existente conduce a la falla principal

 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 occurnetworking while updating the entries.

Necesito poder save estas classs principales en la database, porque son únicas a pesar de que a veces contienen una propiedad de navigation que ya está almacenada. ¿Cómo puedo save al padre de este conflicto de key primaria secundaria?

En el segundo pase, deberá recuperar el Simpleton existente de DbContext . Supongo que podrías hacer eso así:

 `simpleton = Repositor.Simpletons.First(s => s.Id == "Simpleton1");` 

Actualmente, está creando uno nuevo, que el Entity Framework intenta insert como tal, de ahí la violación de key.