实体框架Oracle时间戳

时间:2019-09-03 05:45:14

标签: c# oracle entity-framework linq odp.net

我们有一个名为T_SC_SERVICE的表,其中有INSTANCE_ID列,在Oracle中是Timestamp(6)类型。

我正在使用.NET Framework 4.5,Entity Framework 6和DB First方法。

我正在尝试使用LINQ为此表添加和选择项。

插入LINQ,如下所示:

Service newItem = new Service()  
{  
    InstanceId = DateTime.Now,  
};  


this.ObjectSet.Add(newItem);  
this.SaveChanges(); 

LINQ如下生成SQL。如您所见,INSTANCE_ID参数按预期方式作为DateTime发送。

insert into "DGARSMART"."T_SC_SERVICE"("INSTANCE_ID")  
values (:p0)  

-- :p0: '29.08.2019 07:33:38' (Type = DateTime)  

-- Executing at 29.08.2019 07:33:38 +03:00  

-- Completed in 66 ms with result: 1  

这是我的问题:

使用LINQ选择,如下所示:

internal Service GetServiceByInstanceId(DateTime instanceId)
{
     return this.ObjectSet.FirstOrDefault(i => i.InstanceId == instanceId);
}

LINQ如下生成SQL。 您会看到Instance_ID作为Date发送,而不是DateTime。因此它总是返回Null。这是相同的实体对象和相同的模型。我不知道为什么这个LINQ发送DateTime作为Date类型而不是DateTime。

SELECT   
"Extent1"."INSTANCE_ID" AS "INSTANCE_ID",   
FROM "DGARSMART"."T_SC_SERVICE" "Extent1"  
WHERE (("Extent1"."INSTANCE_ID" = :p__linq__0) AND (:p__linq__0 IS NOT NULL)) AND (ROWNUM <= (1)   

-- p__linq__0: '29.08.2019 07:33:38' (Type = Date)  

-- Executing at 29.08.2019 07:34:47 +03:00  

-- Completed in 5 ms with result: OracleDataReader  

我正在使用以下软件包:

 <package id="Oracle.ManagedDataAccess" version="12.2.1100" targetFramework="net45" />

 <package id="Oracle.ManagedDataAccess.EntityFramework" version="12.2.20190115" targetFramework="net45" />

 <package id="EntityFramework" version="6.0.0" targetFramework="net45" />

1 个答案:

答案 0 :(得分:0)

我联系了Oracle团队,他们接受了它是一个错误(错误ID:30294734 )。您可以在https://community.oracle.com/thread/4288922上查看我的问题,我们需要等待Oracle.ManagedDataAccess.EntityFramework的新版本得到修复。

但是,作为一种解决方法,我们使用了SQLRawQuery,它对我们有用。

  var service = dbContext.Database.SqlQuery("SELECT * FROM T_SC_SERVICE WHERE INSTANCE_ID > :instanceId", new OracleParameter("instanceId", OracleDbType.TimeStamp, LastTimestamp, System.Data.ParameterDirection.Input)).FirstOrDefault(); 
相关问题