【问题标题】:saving new entity to DataServiceContext with linked new entities使用链接的新实体将新实体保存到 DataServiceContext
【发布时间】:2016-10-14 19:46:59
【问题描述】:

我的客户端项目中有一个对 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”。这确实会导致问题 - 数据库中已存在主键为“0”的“A”实体。

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

我非常确定我在那里做错了什么,任何人都可以就如何使用单个 SaveChanges 完成它提供任何建议吗?

【问题讨论】:

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


    【解决方案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);
    

    在我的情况下,创建的对象在保存更改调用之后没有被使用,所以在保存调用之后对象没有链接到内存中并不重要。如果您需要在 save 调用后将对象也链接到内存中,我可以想到两件事来尝试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多