2013-03-11 65 views
2

我有2个使用ODataModelBuilder公开为OData的实体(订单和产品)。在Order实体中,有一个Status复杂类型。有没有办法公开状态复杂类型?Web API OData - 使用ODataModelBuilder公开ComplexType

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实体类型中定义状态ComplexProperty,因此,从订单类型中删除了状态属性。订单实体类型必须具有状态。

有没有人在Web API中使用OData之前发现过这个问题?

+0

您的模型构建代码对我来说看起来很好。您是否说该订单在创建的模型中没有复杂的财产状态? – 2013-03-11 06:39:37

+0

我认为他需要属性的路由约定。 – 2013-03-11 07:47:23

+0

这很好,工作完美。订单具有状态复杂属性。我想要做的是将状态暴露为OData,所以我可以这样做:http:// localhost/OData/Status来查看可用状态列表。 – stack247 2013-03-12 03:55:21

回答

3

似乎没有办法做刚好你想做什么。但是,你当然可以解决这个问题。

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的呼叫。让我知道这是否适合你。

+0

这是一个很有意思的想法..尽管你已经重复了类,但是代码不会很干净,但是我认为它可能会起作用,我会试试看。谢谢! – stack247 2013-03-20 00:11:14

+0

解决了我的问题,只需将基类声明为“复杂类型” – Raffaeu 2017-01-31 14:16:40