如何让 Web API OData v4 使用 DateTime

2023-12-30

我有一个相当大的数据模型,我想使用 OData V4 协议使用 Web API OData 来公开该模型。

底层数据存储在 SQL Server 2012 数据库中。该数据库中有许多日期时间列。

当我连接它时,我收到一个错误,指出不支持 System.DateTime。

所以这是我的问题,我该怎么做才能在 OData feed 中看到我的 DateTime 列?

注意:我无法返回并将所有列更改为 DateTimeOffset 列。

我尝试更改实体框架 edmx 中列的类型,但它给了我这个错误:

指定的成员映射无效。类型“MyProject.MyEntity”中成员“MyPropertyHere”的类型“Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]”与“SqlServer.datetime[Nullable=False,DefaultValue=,Precision=3]”不兼容' 类型为 'MyDataModel.Store.MyEntity' 的成员 'MyColumnName'。

(基本上是说 DateTime 与 DateTimeOffset 不兼容。)

Web API OData 团队是否真的忽略了所有需要使用 SQL Server 类型的人?DateTime?

更新:我已经找到了解决方法,但它们需要更新 EF 模型才能工作。如果可以避免的话,我宁愿不必单独更新数百个属性。

Update:这个问题让我意识到微软在管理其OData产品的方式上存在着深刻的缺陷。问题有很多,但最突出的就是这个。 Web API OData 中缺少大量功能。交易 http://www.getbreezenow.com/documentation/odata-server and 插入件的排序 http://www.getbreezenow.com/documentation/odata-server成为他们中的两个。这两项(在 OData 规范中以及在 Microsoft 终止之前在 WCF 数据服务中)对于任何实际系统都至关重要。

但他们并没有将时间花在 OData 规范中缺少功能的关键点上,而是决定将时间花在删除对许多开发人员非常有帮助的功能上。 它集中体现了糟糕的管理,优先删除工作功能而不是添加急需的功能。

我尝试与 Web API OData 代表讨论这些问题,最后,我打开了一个问题/票证,几天后就关闭了。这就是他们愿意做的事情的结束。

正如我所说,Web API OData 的管理还有很多问题(与 DateTime 无关,因此我不会在这里列出)。我一直是 OData 的坚定支持者,但 Web API OData 管理的明显问题迫使我和我的团队/公司放弃它。

幸运的是,普通的 Web API 可以设置为使用 OData 语法。设置控制器需要更多工作,但最终效果很好。并且它支持日期时间。 (而且管理层似乎至少可以避免做出极其糟糕的决定。)


到目前为止,DateTime 还不是OASIS OData V4 标准 http://www.odata.org/documentation/odata-version-4-0/Web API 不支持 DateTime 类型,但支持 DateTimeOffset 类型。

However,OData 团队现在正在致力于支持 DataTime 类型。我希望您可以在下一个 Web API 版本中使用 DateTime 类型。如果您等不及下一个版本,我根据以下内容编写了一个示例blog http://www.odata.org/blog/how-to-use-sql-spatial-data-with-wcf-odata-spatial/。希望它可以帮助你。谢谢。

Model

public class Customer
{
    private DateTimeWrapper dtw;

    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime Birthday
    {
        get { return dtw; }
        set { dtw = value; }
    }

    [NotMapped]
    public DateTimeOffset BirthdayOffset
    {
        get { return dtw; }
        set { dtw = value; }
    }
}

public class DateTimeWrapper
{
    public static implicit operator DateTimeOffset(DateTimeWrapper p)
    {
        return DateTime.SpecifyKind(p._dt, DateTimeKind.Utc);
    }

    public static implicit operator DateTimeWrapper(DateTimeOffset dto)
    {
        return new DateTimeWrapper(dto.DateTime);
    }

    public static implicit operator DateTime(DateTimeWrapper dtr)
    {
        return dtr._dt;
    }

    public static implicit operator DateTimeWrapper(DateTime dt)
    {
        return new DateTimeWrapper(dt);
    }

    protected DateTimeWrapper(DateTime dt)
    {
        _dt = dt;
    }

    private readonly DateTime _dt;
}

数据库上下文

public DbSet<Customer> Customers { get; set; }

EdmModel

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

builder.EntitySet<Customer>("Customers");

var cu = builder.StructuralTypes.First(t => t.ClrType == typeof(Customer));
cu.AddProperty(typeof(Customer).GetProperty("BirthdayOffset"));
var customer = builder.EntityType<Customer>();

customer.Ignore(t => t.Birthday);
var model = builder.GetEdmModel();

config.MapODataServiceRoute("odata", "odata", model);

控制器

像平常一样添加 OData 控制器。

Test

Payload

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Web API OData v4 使用 DateTime 的相关文章

  • 您可以从 MethodInfo 对象获取 Func (或类似的)吗?

    我意识到 一般来说 使用反射会对性能产生影响 实际上 我本人根本不喜欢反思 这纯粹是学术问题 假设存在一些如下所示的类 public class MyClass public string GetName return My Name 请耐
  • Awaiter (GetAwaiter) 和ContinueWith 有什么区别

    在 net 4 0中 我经常使用Task ContinueWith 但是之后我发现了 task GetAwaiter https stackoverflow com a 14171923 284758这似乎有同样的目的 有什么不同 如果您的
  • 使用 WCF 的契约优先 SOA

    这个问题更多的是探索人们在社区中 在实际情况中所做的事情 而不是一个有针对性的问题 我对此进行了相当广泛的搜索 虽然我发现很多博主都提倡契约优先的服务设计 并且有一些评论支持它们 但我还没有找到很多关于使用 WCF 实现契约优先的实用信息
  • 急切操作和短路操作之间的区别? (| 与 || 以及 & 与 &&)

    我 仍在 学习 C 我认为我理解两者之间的区别 也 然而 在阅读了另一篇指南后 很明显我不明白 我写了一个小真值表 正如我所想 它们返回相同的结果 从我读到的内容来看 使用双符号听起来是一种更好的解决方案 但我对其中的差异有点困惑 想知道是
  • 如何读取 Excel XML (C#)

    我想知道是否有一种简单的方法来读取Excel 2010 XML 该 XML 的结构与我以前阅读的不同 特别是 ss index 属性 ss Index 7 使事情变得更加复杂 EDIT 为了更好地解释 我有一个带有 XML 扩展名的文件 可
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • .NET 中有处理 Modbus 协议的好库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个好的 最好是开源的 库来处理 Modbus 协议 我看过一些图书馆 但我正在寻找一些人的
  • 用于匹配字符的正则表达式,但当它包含在方括号中时则不匹配

    输入字符串 Wsg Fs A A A Cgbs Sg7 Wwg s Fs A A Afk Cgbs Sg7 所需的输出是一个字符串数组 Wsg Fs A A A Cgbs Sg7 Wwg s Fs A A Afk Cgbs Sg7 如果我将
  • 如何将文本保留在控制台顶部?

    我试图让我的控制台应用程序自动滚动 但将文本保留在顶部 文本历史记录必须可访问 以便Console Clear不可行 是否有任何方法可以检测控制台何时滚动或有任何方法可以调整当前的 Y 位置 因为我知道当您的文本即将离开屏幕时控制台会滚动
  • WinForms 验证事件阻止 Escape 键关闭表单

    我有一个简单的表单 带有一个文本框 加上 确定 和 取消 按钮 表单的 AcceptButton 和 CancelButton 设置正确 并且 确定 和 取消 按钮的 DialogResult 设置为 确定 和 取消 我想向 TextBox
  • COM 互操作注册

    我有一个正在暴露的 NET 程序集COM http en wikipedia org wiki Component Object Model 该程序集有两个公共接口和一个公共类 当我构建程序集时 我收到此警告 AssemblyName dl
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 使用 F5 时,finally 似乎没有在 C# 控制台应用程序中执行

    int i 0 try int j 10 i catch IOException e finally Console WriteLine In finally Console ReadLine 在VS2008中按F5时 finally块似乎
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • AutoMapper.Mapper 不包含 CreateMap 的定义

    这可能是一个基本问题 但想知道我没有得到 AutoMapper Mapper CreateMap 方法 我使用了错误的 AutoMapper 参考 包吗 谢谢 静态版本CreateMap方法在 4 2 中已弃用 然后在版本 5 0 中从 A
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • DotNET 应用程序中的 GDI 句柄

    我的纯 DotNET 库作为非托管桌面应用程序中的插件运行 我收到了稳定的 虽然低 崩溃报告流 这些报告似乎表明 GDI 句柄存在问题 错误消息中的字体等 恢复为系统字体 各种控件的显示崩溃 不久后发生大规模崩溃 我的窗体几乎没有控件 但我
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐