EF插入重复的父对象

时间:2011-02-17 23:03:11

标签: entity-framework

我有两个班级:

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

4 个答案:

答案 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不会导致重复。我的猜测是你的真实代码使用两种不同的上下文。

代码中唯一要更改的内容(由于fooIQueryable<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();