实体框架 - 在插入内部调用SaveChanges时复制相关实体

时间:2011-08-25 02:27:14

标签: c# entity-framework wcf-ria-services

我正在客户端创建一个带有新Child实体的新Parent实体。这是一对多的关系。

//Client has created a new Parent with a new Child attached 
//e.g. Parent.Child = new Child();
//This is submitted to the server, and ends up here:
public void InsertParent(Parent parent)
{ 
    ObjectContext.Parents.AddObject(parent); //No Parent.ID yet
    ObjectContext.SaveChanges(); //Now I have a Parent.ID

    //Do some stuff with the Parent.ID here. (Nothing is changed with the Parent or Child, just using Parent.ID)
}

我的问题是,在所有这些之后,我最终在数据库中使用两个子实体。我的猜测是EF已经为排队的子进行插入,当我调用SaveChanges时,它会为同一个子实体创建另一个插入。

我在这里有SaveChanges的原因是我希望在创建父项后使用Parent.ID做一些事情,但是我需要在它获得ID之前保留Parent(主键由DB创建)。当我把所有额外的代码都拿出来时(从SaveChanges开始),一切都按预期工作。

2 个答案:

答案 0 :(得分:1)

我意识到这篇文章已经很老了,但是我遇到了同样的问题,并没有找到一个很好的方法。我正在使用WPF和Binding。我正在尝试插入一个与多个子​​表绑定的历史记录。我最后做的是确保没有插入孩子:

Parent.ChildID = Parent.Child.ChildID;
Parent.Child = null;

这似乎完全是黑客,但它确实有效。

答案 1 :(得分:0)

  • 在此方法中放置一个断点,以确认父级中只有一个Child。
  • 在SaveChanges()之后立即返回以确认您的其他“东西”没有进行任何其他更改
  • 确保ObjectContext已实例化并正确处理。为什么这个方法没有实例化上下文 - 它来自哪里?

除非您进行更多调试并确定问题的确切位置,否则很难说出这里发生了什么。

您的操作应该接受Parent with Child,只需实例化上下文并插入即可。如果你能确认它只是这样做,那么你很可能会发现你的问题。