【发布时间】:2015-04-06 13:17:24
【问题描述】:
EDIT-2:经过数小时的研究,几乎每个 google 上与 odata 相关的链接都变成紫色,我发现 OData 中存在“深插入”(link)的概念规格。所以毕竟,我正在做的事情应该可以工作,即使没有链接。有谁知道如何在 Microsoft OData 客户端上启用此功能?是否还有其他支持该概念的 OData 客户端?
编辑:也许这是错误的方法,所以如果我做错了,请告诉我。无法保存真的阻碍了我们的进步!
我对 OData v3 有疑问。我有一个类Associate 有一个必需的Address。当我尝试发布新的 Associate 时,由于 Address 属性为 null(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
但是,在服务器上,在控制器中,Associate 到达时没有外键。当我使用 Fiddler 检查 POST 请求时,我明白了原因:
{
"odata.type" : "xxx.Data.Entities.Associate",
"AddressId" : 0,
"Id" : 0,
"IsLegalRepresentative" : false,
"IsMailReceiver" : false,
"Name" : "John Doe",
"Role" : "Father"
}
即使客户端上生成的类具有Address 属性,地址也不会传输。
我该如何解决这个问题?
【问题讨论】:
-
您是否设置了实体框架模型以将 AddressId 属性正确绑定到 Address 实体?我经常忘记这样做,所以我的属性没有正确链接到外键。
-
@TheSenator 地址也是新的,这就是为什么我需要服务器端的物化对象,所以 EF 可以管理其余部分(因为它做得很好)。
-
如何从客户端发送 JSON POST 请求?更确切地说,您如何在客户端序列化 Associate / Address?
-
@nXu 我只是调用了 context.SaveChanges(),所以 context 以黑盒方式进行序列化。
标签: c# .net asp.net-web-api odata