2014-06-12 75 views
3

我試圖將V3轉換爲V4。但是,該轉換顯示刪除了對System.DateTime的支持,如http://aspnetwebstack.codeplex.com/workitem/1753中所示。我無法將模型更改爲使用偏移量。還有其他問題,但沒有提供任何工作。OData V4 System.DateTime突破變化

我attemtped做這樣的事情:

var builder = new ODataConventionModelBuilder(); 
var config = builder.EntitySet<DepartmentListItem>("DepartmentList"); 
config.EntityType.Ignore(x => x.StartDate); 
var ops = new ODataQueryOptions<DepartmentListItem>(new ODataQueryContext(builder.GetEdmModel(), typeof(DepartmentListItem), null), queryOptions.Request); 
var query = ops.ApplyTo(_uow.Set<DepartmentListItem>()).Cast<DepartmentListItem>(); 

只是爲了得到它的工作,但無濟於事。無論如何要手動處理這種轉換。

謝謝。

+0

爲https://aspnetwebstack.codeplex.com/workitem/2072和http://aspnet.uservoice投票。com/forums/147201-asp-net-web-api/suggestions/6242255-odata-v4-service-should-support-datetime – Rory

回答

0

我不確定你有什麼樣的問題。我的項目使用了帶有webAPI的EntityFrameworkModel。當我試圖從V3遷移到V4時。我遇到了同樣的問題。我的解決辦法是像如下:

1.更改的CLRObject模型中的

//Represent the data in DB 
private Nullable<DateTime> OrderDateOnInternal { get; set; } 

//Data exposed by Service 
public Nullable<DateTimeOffset> OrderDate         
{ 
    get { return new DateTimeOffset(OrderDateOnInternal.Value);} 
    set { OrderDateOnInternal = value.Value.DateTime; } 
} 

2.改變conceptualModels在*** Model.edmx這是從我的數據庫生成的模型認定中。

原來生成CSDL內容訂購日期是像

<Property Name="OrderDate" Type="DateTime" Precision="3" /> 

然後我改成了

<Property Name="OrderDateOnInternal" Type="DateTime" Precision="3" /> 

3.更改在CS映射內容的映射

原始生成的映射內容就像

<ScalarProperty Name="OrderDate" ColumnName="OrderDate" /> 

於是我改成了

<ScalarProperty Name="OrderDateOnInternal" ColumnName="OrderDate" /> 

這對我的作品。

+3

問題在於你正在爲你的OData定製實體框架模型。如果您將模型放在單獨的庫中並計劃將其用於OData和其他項目(例如後端服務和控制檯應用程序),那麼其他進程現在必須使用DateTimeOffset而不是DateTime。理想情況下,您可以轉換OdataConventionModelBuilder中的值,因此常規模型保持不變。 –

+1

我同意加雷思。對於已經使用的現有EF模型,這是一個不起眼的東西。 –

+1

當您有大約300個需要修改以與OData V4配合使用的屬性時,這也是一個糟糕的解決方案。注意:我並不是說有更好的方法,但它是微軟極度短視不支持DateTime和DateTimeOffset。 – Vaccano

6

(SO告訴我,我太綠後才能發表評論,從而發佈回覆代替)

我着重跟加雷同意。我們有很多應用程序使用的基於EDMX的EF環境(WPF,MVC)。它是不可能的,近乎荒謬的是,考慮修改這樣的方法,以避免V4團隊缺乏對EF支持數據庫而不是存儲庫概念數據模型的認識。回到V3直到一個現實檢查排序出來(也許V4.1?)。

0

如果您在控制客戶端,我最近發現您可以通過投射到Edm.DateTimeOffset來解決問題。這裏是什麼幫助我克服這個障礙的例子:

請求的OData v4的前值:/odata/item?$filter=someDate+gt+datetime'2016-06-16'

的OData v4的請求:/odata/item?$filter=someDate+gt+cast(2016-06-16, Edm.DateTimeOffset)

希望有所幫助。