【问题标题】:Setting data type in ODataConventionModelBuilder在 ODataConventionModelBuilder 中设置数据类型
【发布时间】:2014-08-01 05:12:12
【问题描述】:

我在OData 文档中看到有Edm 类型DateTime。目前在我的数据库中有许多 DATE 字段在 EF 中表示为 DateTimes,因此 ODataConventionModelBuilder 将它们声明为 Edm.DateTime。如何将它们更改为Edm.Date

希望我能做到这一点:

entityType.Property(p => p.AgreementDate).EdmType = EdmType.Date;

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    某个属性对应的Edm类型是从CLR类型映射而来的,不能被ODataConventionModelBuilder覆盖。

    如果要更改 Edm 类型,可以忽略 ODataConventionModelBuilder 中的这些属性。

    通过在ODataConventionModelBuilder 上调用 GetEdmModel 获取 Edm 模型后,您可以通过调用 OData API 将这些带有 Edm.Date 的属性添加到 Edm 模型中。

    【讨论】:

    • 这很尴尬。希望 MS 能从建造者那里实现这一点。
    • 更改默认的 Edm 类型可能会影响序列化和反序列化。您可以在 codeplex aspnetwebstack.codeplex.com/workitem/list/basic 中为其创建一个工作项
    • 我试过你的方法。结果是一个例外:An incompatible primitive type 'Edm.DateTimeOffset[Nullable=False]' was found for an item that was expected to be of type 'Edm.Date[Nullable=False]'. 你能指出一个使用Edm.Date 的例子吗?
    • @veertien,您必须在模型中使用Microsoft.OData.Edm.Library.Date 作为属性类型(不仅仅是DateTime)。例如:class MyModel{ public Date AgreementDate {get;set;}}
    • 很遗憾,您不能将Microsoft.OData.Edm.Library.Date 与实体框架一起使用。
    【解决方案2】:

    如果有人对如何执行赵峰的建议的细节感兴趣,这是我的答案。我没有发现 API 太容易被发现,所以我想分享一下。

    首先,像往常一样使用ODataConventionModelBuilder 构建您的EDM 模型,但忽略日期属性:

    ...
    entitType.Ignore(p => p.AgreementDate);
    ...
    IEdmModel model = builder.GetEdmModel();
    

    然后“手动”添加日期属性:

     var myType = (EdmStructuredType)model.FindDeclaredType(typeof(MyType).FullName);
     var dateType = (IEdmPrimitiveType)model.FindType("Edm.Date");
     myType.AddProperty(new EdmStructuralProperty(myType, "AgreementDate", new EdmPrimitiveTypeReference(dateType, false)));
    

    就是这样。

    【讨论】:

    • 这是什么 OData 版本?我有OData v3,当我model.FindType("Edm.Date")时,返回一个空值。
    • 这是 OData v4。 Microsoft.OData.Edm,更具体的版本为 6.11.0。
    • 好的,谢谢。当我迁移到 OData 4 时,我将不得不尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2017-04-10
    • 2017-10-24
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多