2013-03-11 60 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