C# 如果子外键已存在,则SaveChanges上的DbUpdateException将更改-首先在实体框架代码中

C# 如果子外键已存在,则SaveChanges上的DbUpdateException将更改-首先在实体框架代码中,c#,.net,sql,entity-framework,orm,C#,.net,Sql,Entity Framework,Orm,[在实体框架5.0 RC中使用代码优先的DbContext] 具有2个导航属性/2个外键的实体 第一步-将更改保存到空数据库工作 第二遍-现有子外键导致父级错误 DbUpdateException:更新条目时出错。 我需要能够将这些父类保存到数据库中,因为它们是唯一的,即使它们有时包含已存储的导航属性-我如何才能从该子主键冲突中保存父项?在第二步中,您需要从DbContext中检索现有的Simpleton。我猜你可以这样做: `simpleton = Repositor.Simpletons.F

[在实体框架5.0 RC中使用代码优先的DbContext]

具有2个导航属性/2个外键的实体 第一步-将更改保存到空数据库工作 第二遍-现有子外键导致父级错误
DbUpdateException:更新条目时出错。


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

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

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

目前,您正在创建一个全新的实体框架,实体框架试图将其插入,因此出现了密钥冲突。

确实如此!替换为
var simpleton=Repositor.Simpletons.Find(“Simpleton1”);如果(simpleton==null){simpleton=new simpleton();simpleton.Id=“Simpleton1”}
-我希望这可以自动完成,但现在我必须在有子属性的情况下多次实现此过程…您可以添加
FirstOrNew(字符串Id)
将方法扩展到
IEnumerable,其中T:IIdentifierOwner,new
并使用它
IIIdentifierOwner
将有一个字符串
Id
属性,可以获取并设置该属性。。。
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();
`simpleton = Repositor.Simpletons.First(s => s.Id == "Simpleton1");`