gpt4 book ai didi

c# - 使用所需的外键在 OData 中插入实体

转载 作者:太空狗 更新时间:2023-10-29 21:57:34 24 4
gpt4 key购买 nike

EDIT-2:经过数小时的研究,几乎所有与 odata 相关的 google 链接都变成了紫色,我发现 OData 中存在“深度插入”(link)的概念规范。所以毕竟,即使没有链接,我所做的也应该有效。有谁知道如何在 Microsoft OData 客户端上启用它?是否有任何其他支持该概念的 OData 客户端?

编辑:也许这是错误的方法,如果我做的完全错了,请告诉我。无法保存真的阻碍了我们的进步!

我对 OData v3 有疑问。我有一个 Associate 类,它有一个必需的 Address。当我尝试 POST 一个新的 Associate 时,由于 Address 属性为空(EF6 抛出外键违规的 DbUpdateException)而失败。我的 Associate 类如下所示:

public class Associate
{
public int Id { get; set; }

[Required, StringLength(100)]
public string Name { get; set; }

[Required, StringLength(50)]
public string Role { get; set; }

public bool IsMailReceiver { get; set; }
public bool IsLegalRepresentative { get; set; }

[ForeignKey("AddressId")]
public virtual Address Address { get; set; }
public int AddressId { get; set; }
}

我使用微软OData客户端,尝试通过以下方式添加关联:

var associate = new Associate { /* ... */ };
context.AddObject("Associates", associate);
context.AddObject("Addresses", associate.Address);

/* UI fills associate data */

context.SetLink(associate, "Address", associate.Address);
context.UpdateObject(associate);
context.UpdateObject(associate.Address);

/* at this point the associate has the address set! */

context.SaveChanges(); // << Exception

然而,在服务器上,在 Controller 中,Associate 到达时没有外键。当我使用 Fiddler 检查 POST 请求时,我明白了原因:

{
"odata.type" : "xxx.Data.Entities.Associate",
"AddressId" : 0,
"Id" : 0,
"IsLegalRepresentative" : false,
"IsMailReceiver" : false,
"Name" : "John Doe",
"Role" : "Father"
}

即使在客户端生成的类具有 Address 属性,也不会传输地址。

我该如何解决这个问题?

最佳答案

我也找不到任何关于此的信息 - 它确实感觉像是 OData 中的一个问题。以下是我设法让它发挥作用的方法。

显式定义外键

class Student {
public int TeacherId { get; set; }

[Required, ForeignKey("TeacherId")]
public virtual Teacher Teacher { get; set; }
}

执行插入时,获取相关记录并修复模型状态:

  public IHttpActionResult Post(Student student)
{
student.Teacher = this.db.Teacher.FirstOrDefault(i => i.TeacherId == student.TeacherId);
if (student.Teacher != null)
{
this.ModelState.Remove("student.Teacher");
}

if (!this.ModelState.IsValid)
{
return this.BadRequest(this.ModelState);
}
}

所以从那时起,要发布学生,您将忽略教师字段,只需使用 TeacherId 进行发布。

我还没有用 OData 客户端测试过这个,但我想不出为什么这不起作用。您只需使用 Id 字段而不是对象。

关于c# - 使用所需的外键在 OData 中插入实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com