【问题标题】:Web API OData - Expose ComplexType with ODataModelBuilderWeb API OData - 使用 ODataModelBuilder 公开 ComplexType
【发布时间】:2013-03-11 05:13:10
【问题描述】:

我有 2 个实体(订单和产品),我使用 ODataModelBuilder 作为 OData 公开。在 Order 实体中,有一个 Status 复杂类型。有没有办法暴露 Status 复杂类型?

ODataModelBuilder _modelBuilder = new ODataModelBuilder();

var _status = _modelBuilder.ComplexType<Status>();
_status.Property(x => x.Description);
_status.Property(x => x.Name);
_status.Property(x => x.StatusId);

var _order = _orders.EntityType;
_order.HasKey(x => x.OrderId);
_order.Property(x => x.ProductId);
_order.Property(x => x.Quantity);
_order.ComplexProperty(x => x.Status);

var _product = _products.EntityType;
_product.HasKey(x => x.ProductId);
_product.Property(x => x.Name);
_product.Property(x => x.Description);

我能想到的另一种方法是将 Status 转换为 EntityType。但是,使用这种方法,我无法在 Order 实体类型中定义 Status ComplexProperty,因此,从 Order 类型中删除了 Status 属性。 Order 实体类型必须具有 Status。

有没有人在使用 OData in Web API 之前遇到过这个问题?

【问题讨论】:

  • 您的模型构建代码对我来说看起来不错。您是说订单在创建的模型中没有复杂的属性状态?
  • 我认为他需要属性的路由约定。
  • 一切正常,运行良好。订单确实具有 Status 复杂属性。我想要做的是将状态公开为 OData,所以我可以这样做:localhost/OData/Status 以查看可用状态列表。

标签: c# asp.net asp.net-web-api odata


【解决方案1】:

似乎没有办法完全做你想做的事。但是,您当然可以解决这个问题。

public class Status
{
   // whatever you have here...
}

// essentially create a duplicate class
public class DerivedStatus : Status { }

// using modelBuilder...
modelBuilder.ComplexType<Status>();
modelBuilder.EntitySet<DerivedStatus>("Statuses");

不太理想,但它似乎有效。据我所知,您还必须删除对 ComplexProperty 的调用。让我知道这是否适合你。

【讨论】:

  • 这是一个有趣的想法。虽然代码不会很干净,因为你有重复的课程,但我认为它可能有效,我会试一试。谢谢!
  • 通过将基类声明为“复杂类型”解决了我的问题
猜你喜欢
  • 2013-09-09
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多