使用链接的新实体将新实体保存到DataServiceContext

时间:2016-10-14 19:46:59

标签: c# .net entity-framework wcf odata

我的客户端项目中有一个DataServiceContext类的服务引用。

我需要创建一个新实体并将其保存到数据库上下文中。

当我单独保存这个实体而没有任何链接实体时,一切顺利。

A a = new A();
context.AddToAs(a);
context.BeginSaveChanges(o=>{
    //some after-save code there
}, null);

然而,代码如下:

A a = new a(); //parent entity
B b = new b(); //child entity which has corresponding b.A navigation
               //property and b.AId field for referencing 'A' entity primary
               //key.
a.b = b;
context.AddToAs(a);
context.AddToBs(b);
context.SetLink(b, "A", a);
context.BeginSaveChanges(o=>{
    //some after-save code here
}, null);

...因“INSERT语句与FOREIGN KEY约束冲突”错误而失败。

当然我理解新创建的'A'实体的主键设置为'0','B'实体中的相应导航属性,如b.AId,在保存时也等于'0'。这确实会导致问题 - 数据库中已经存在'A'主键,其中包含'0'主键。

所以我必须首先保存'A'实体,不分配任何链接'B',以便'A'实体被保存并接收真实ID,然后 - 将'B'附加到A并再次保存上下文,以便“B”实体已保存。

我更确定我在那里做了一些非常错误的事情,有人可以就如何使用一个SaveChanges提出任何建议吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我的解决方案是不将内存中的对象链接起来。我只使用了context.SetLink。因此,对于您的示例,我认为这样可行:

A a = new a(); //parent entity
B b = new b(); //child entity which has corresponding b.A navigation
               //property and b.AId field for referencing 'A' entity primary
               //key.
// Omit this line. a.b = b;
context.AddToAs(a);
context.AddToBs(b);
context.SetLink(b, "A", a);
context.BeginSaveChanges(o=>{
    //some after-save code here
}, null);

在我的情况下,在保存更改调用之后没有使用创建的对象,因此在保存调用之后对象没有在内存中链接也没关系。如果您需要在保存调用后将对象链接到内存中,我可以考虑尝试两件事:

  • 保存后从上下文加载对象。这是一个不必要的数据库调用,但它意味着加载的对象将具有正确的链接。
  • 在保存更改后手动分配关联(例如a.b = b;)