OData V4 System.DateTime中断更改

OData V4 System.DateTime中断更改,odata,asp.net-web-api2,Odata,Asp.net Web Api2,我正在尝试将V3转换为V4。但是,转换显示已删除对System.DateTime的支持,如中所示。我无法将模型更改为使用偏移量。关于这一点还有其他问题,但没有提供解决办法 我试图做这样的事情: var builder = new ODataConventionModelBuilder(); var config = builder.EntitySet<DepartmentListItem>("DepartmentList"); config.EntityType.Ignore(x =

我正在尝试将V3转换为V4。但是,转换显示已删除对System.DateTime的支持,如中所示。我无法将模型更改为使用偏移量。关于这一点还有其他问题,但没有提供解决办法

我试图做这样的事情:

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>();
var builder=new ODataConventionModelBuilder();
var config=builder.EntitySet(“部门列表”);
config.EntityType.Ignore(x=>x.StartDate);
var ops=新的ODataQueryOptions(新的ODataQueryContext(builder.getedModel(),typeof(DepartmentListItem),null),queryOptions.Request);
var query=ops.ApplyTo(_uow.Set()).Cast();
只是为了让它发挥作用,但没有用。是否仍然需要手动处理此转换


谢谢。

我不知道你有什么问题。我的项目正在使用EntityFrameworkModel和webAPI。当我尝试从V3迁移到V4时。我也有同样的问题。我的解决方案如下:

1.更改模型中的CLR对象

//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; }
}
//以DB表示数据
私有可为空的OrderDateOnInternal{get;set;}
//由服务公开的数据
公共可为空的OrderDate
{ 
获取{返回新的DateTimeOffset(OrderDateOnInternal.Value);}
设置{OrderDateOnInternal=value.value.DateTime;}
}
二,。更改从我的数据库生成的***model.edmx中conceptualModels中的模型定义

OrderDate最初生成的CSDL内容如下

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

然后我把它改成了

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

三,。更改c-s映射内容中的映射

原始生成的映射内容如下所示

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

然后我把它改成了

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

这对我很有用。

(所以告诉我我太绿了,不能发表评论,所以改为发表回复)


我完全同意加雷斯的观点。我们有一个非常完善的基于EDMX的EF环境,由许多应用程序(WPF、MVC)使用。这是不可能的,近乎荒谬,考虑修改这样只是为了绕过V4团队缺乏欣赏,EF存在支持数据库,而不是存储更少的概念数据模型。回到V3,直到现实检查解决了这个问题(可能是V4.1?)

如果您控制了客户端,我最近发现您可以通过强制转换到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)


希望这会有所帮助。

问题在于您正在根据OData定制实体框架模型。如果您将模型放在单独的库中,并计划将其用于OData和其他项目(例如,后端服务和控制台应用程序),那么这些其他进程现在必须使用DateTimeOffset,而不是DateTime。理想情况下,您可以转换OdataConventionModelBuilder中的值,这样常规模型就完好无损了。对于已经在使用的现有EF模型来说,这是一个不成功的解决方案。当您有大约300个属性需要修改才能使用OData V4时,这也是一个糟糕的解决方案。注意:我不是说有更好的方法,而是说微软不同时支持DateTime和DateTimeOffset是非常短视的