如果子外键已存在,则在SaveChanges上出现DbUpdateException - 在Entity Framework Code First中

时间:2012-06-12 14:13:24

标签: c# .net sql entity-framework orm

[将Code First DbContext与Entity Framework 5.0 RC一起使用]

具有2个导航属性/ 2个外键的实体

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 to Empty Database Works

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

第二次通过 - 现有子外键导致父母错误

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.

我需要能够将这些父类保存到数据库中,因为它们是唯一的,即使它们有时包含已存储的导航属性 - 如何从父子主键冲突中保存父类? / em>的

1 个答案:

答案 0 :(得分:1)

在第二次传递中,您需要从Simpleton检索现有的DbContext。我猜你可以这样做:

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

目前,您正在创建一个全新的实体框架,实体框架会尝试插入,因此违反密钥。