我有两个班级:
public class Foo
{
public int FooId {get;set;}
public virtual ICollection<Bar> Bars {get;set;}
}
public class Bar
{
public int BarId {get;set;}
public virtual Foo {get;set;}
}
如果我运行以下代码,我会在FooId上获得Foreign Key Conflict
。
var foo = from f in context.Foos
where f.FooId == 1
select f;
var bar = new Bar();
bar.Foo = foo;
context.Bars.Add(bar);
context.SaveChanges();
如果我在SQL中禁用所有密钥检查,我最终会在数据库中重复Foo
。
答案 0 :(得分:1)
我认为你正在以错误的方式解决问题。您希望将新的Bar对象添加到现有的foo对象中,而不是相反:
var foo = from f in context.Foos
where f.FooId == 1
select f;
var bar = new Bar();
foo.Bars.Add(bar);
context.SaveChanges();
答案 1 :(得分:1)
使用相同的上下文加载foo
与添加相关bar
的新foo
不会导致重复。我的猜测是你的真实代码使用两种不同的上下文。
代码中唯一要更改的内容(由于foo
是IQueryable<Foo>
而不是Foo
而无法编译)是为了实现foo
,例如:
var foo = (from f in context.Foos
where f.FooId == 1
select f).Single();
除此之外,代码片段还可以。
答案 2 :(得分:0)
尝试
var bar = new Bar();
context.Bars.Add(bar);
bar.Foo == foo;
context.SaveChanges();
在将实体添加到上下文之前进行赋值时,似乎未对实体键进行唯一设置。
答案 3 :(得分:0)
不确定这是否是最佳做法,但是当我遇到这个问题时,我最终将父实体设置为Null但保留了任何FK引用,这阻止了父实体插入子实体:
var bar = new Bar();
context.Bars.Add(bar);
bar.Foo == null;
bar.FooId = existingFooParent.Id;
context.SaveChanges();