【问题标题】:WebAPI - odata service adding ForeignKeyWebAPI - odata 服务添加 ForeignKey
【发布时间】:2013-06-03 11:19:08
【问题描述】:

我正在使用 ODataModelBuilder 构建我的模型,我正在尝试创建导航属性,但是在元数据中我没有看到任何前键指示,在我的解决方案中我没有使用 EF,所以没有 foreignKey 属性,是否可以通过代码添加?

【问题讨论】:

  • 澄清一下:你的意思是在 $metadata 文档中,你想在你的Association 中看到一个ReferentialConstraint 元素吗?或者,您只是想弄清楚如何使用 ODataModelBuilder 在两个实体集之间创建导航?
  • 我能够创建导航属性,但是当我使用 wcf 数据代理对其进行测试时 - 当我查询主对象时,相关实体是空的,尽管我可以在嗅探器中看到我的猜测它与外键有关
  • 通过 wcf 数据代理,我猜你的意思是 DataServiceContext 类(和相关类)?我想我现在了解您的问题,并且我认为这与外键无关(我将在下面回答)。但是我很困惑,您说当您嗅探有效负载时会显示相关实体数据——您的意思是您看到了相关实体的链接吗?还是属于相关实体的实际数据?我希望除非您在请求 URI 中包含 $expand 查询选项,否则相关实体的实际数据不应该存在。

标签: asp.net-web-api odata


【解决方案1】:

正如您在评论中阐明的那样,您想要添加外键信息的原因是因为您的客户端应用程序在查询主实体时不包括相关实体。我不认为外键是这里的问题。

作为示例,我将使用两种实体类型:CustomerOrder。每个Customer 都有一些关联的Orders,所以我在Customer 上有一个导航属性,称为Orders,它指向Orders 的集合。如果我向/MyService.svc/Customers(1) 发出GET 请求,服务器将响应Customer 的所有信息以及指向相关Order 实体* 的URL。默认情况下,我不会在同一个有效负载中获取每个相关Order 的数据。

如果您希望对Customers(1) 的请求包含与其关联的Orders 的所有数据,您可以将$expand 查询选项添加到请求URI:/MyService.svc/Customers(1)?$expand=Orders。使用 WCF 数据服务客户端 (DataServiceContext),您可以通过 .Expand() 执行此操作:

DataServiceQuery<Customer> query = context.Customers.Expand("Orders");

但是,WebAPI OData 目前不支持$expand(不过最新的夜间版本支持,所以很快就会改变)。

另一种方法是提出单独的请求来填写缺失的订单数据。您可以使用LoadProperty() 方法来执行此操作:

context.LoadProperty(customer, "Orders");

LoadProperty 方法应该适用于目前的 WebAPI。

我知道这并不能回答您最初的问题,但我希望能解决您的意图。

*在 JSON 中,这是 WebAPI OData 服务的默认格式,在线路上不会显示任何链接,但它们仍然“在精神上”存在。客户端应该能够自行计算它们,WCF 数据服务客户端会这样做。

【讨论】:

  • 基本上我正在使用扩展和夜间构建,我正在使用 BreezeJS 对其进行测试 -> 字体填充相关实体,我将尝试使用 wcf 客户端进行扩展
  • 我已经使用 wcf 测试客户端进行了测试,加载属性有效,但扩展没有
  • $expand 是否可以在浏览器中使用?我认为“如何在 WebAPI 中启用 $expand”是一个单独的问题。不过很高兴 LoadProperty 为您工作 :)
  • 奇怪,现在我用提琴手重新测试它,扩展不起作用
  • 也许 $expand 适用于/MyService.svc/Customers 但不适用于/MyService.svc/Customers(1)?至少,这是我遇到的一个问题。
猜你喜欢
  • 2014-05-04
  • 2013-03-12
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多