WCF 数据服务在扩展时从 DateTime 中删除毫秒数

WCF Data services remove milliseconds from DateTime when expand

我在使用 WCF 数据服务 5.6 时遇到一些奇怪的行为。 在我的例子中,我有 table,其中 1 列设置为 Concurrency=Fixed,并且此列包含数据库中的日期时间字段,每次编辑行时都会更新。 如果我只是检索实体 - 此列具有正确的毫秒值。但是,如果我进行映射 - 毫秒将被删除。

这里有个问题一目了然:

============================================= =======================

void Main()
{
    var b = from p in TABLE1 where p.ID == 100 select p;
    b.Dump();
}

这种情况下的请求是:http://xxxx/Data.svc/TABLE1(100M) 从服务返回的数据是:

<d:COL1 m:type="Edm.DateTime">2015-02-16T12:13:52.972</d:COL1>

============================================= =======================

如您所见,这里的时间以毫秒为单位返回 - .972 在其他情况下:

void Main()
{

    var tmp = from p in TABLE1 where p.ID == 100 select 
    new TABLE1() 
    {
        ID=p.ID,
        COL1=p.COL1
    };
    var a1 = tmp.ToList();
    a1.Dump();
}

这种情况下的请求是:http://xxxx/Data.svc/TABLE1(100M)?$select=ID,COL1

  <d:COL1 m:type="Edm.DateTime">2015-02-16T12:13:52</d:COL1>

============================================= =======================

返回时间没有毫秒。

有人遇到同样的问题吗?可能是 WCF 数据服务或模型中的错误?

好的,看来我找到了这个问题的答案,或者至少是避免问题的方法。 首先,我从框架中追踪生成的 SQL,我看到在第一种情况下,我得到 SQL

 SELECT ID, COL1 FROM TABLE1

在第二种情况下,我得到了

 SELECT ID, CAST( COL1 AS DATETIME) FROM TABLE1

导致问题的原因。

然后我尝试将 EF 更新到版本 6,将 WCF 数据服务更新到版本 5.6.3, Oracle ODP 到最新版本,尝试使用 Oracle 托管驱动程序……没有任何成功。

然后我对 table 定义进行了一些调整,我看到我的 col1 在数据库中的类型为 TIMESTAMP,在模型中的 DateTime 被定义为 NOT NULL。 如果我从数据库定义中删除它,我会得到正确的毫秒值。

所以,这可能是 Oracle 驱动程序中的错误,但也可能是 WCF 数据服务中的错误。至少我在这个解决方案中找到了一种使用并发的方法。