实体框架Oracle时间戳 [英] Entity Framework Oracle Timestamp
问题描述
我们有一个T_SC_SERVICE
表,其中的INSTANCE_ID
列在Oracle中是Timestamp(6)
类型.
We have T_SC_SERVICE
table with a INSTANCE_ID
column which is type Timestamp(6)
in Oracle.
我正在使用.NET Framework 4.5,Entity Framework 6和DB First方法.
I'm using .NET Framework 4.5, Entity Framework 6 and DB first approaches.
我正在尝试使用LINQ从此表中添加和选择项.
I'm trying to Add and Select item from this table with using LINQ.
插入LINQ,如下所示:
Service newItem = new Service()
{
InstanceId = DateTime.Now,
};
this.ObjectSet.Add(newItem);
this.SaveChanges();
该LINQ生成SQL如下.如您所见,INSTANCE_ID
参数按照预期的日期时间发送.
That LINQ generates SQL as below. As you can see INSTANCE_ID
parameter is send as a DateTime as expected.
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是作为日期而不是DateTime发送的.因此它总是返回Null.这是相同的实体对象和相同的模型.我不知道为什么这个LINQ发送DateTime作为Date类型而不是DateTime.
That LINQ generates SQL as below. As you can see Instance_ID is send as a Date not DateTime. So it always return Null. This is the same entity object and same model. I could not figure out why this LINQ is sending DateTime as type of Date instead of 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
我正在使用这些软件包:
I'm using these packages:
<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" />
推荐答案
我联系了Oracle团队,他们接受了它是一个错误(错误ID:30294734 ).您可以在以下位置查看我的问题: https://community.oracle.com/thread/4288922 ,我们需要等待Oracle.ManagedDataAccess.EntityFramework
的新版本被修复.
I reached to Oracle team and they accepted that it is a bug (Bug id : 30294734). You can check my issue on : https://community.oracle.com/thread/4288922, we need to wait for the new version of Oracle.ManagedDataAccess.EntityFramework
it will be fixed.
但是,作为一种解决方法,我们使用了 SQLRawQuery
,它对我们有用.
However, as a workaround we used SQLRawQuery
, it worked for us.
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();
这篇关于实体框架Oracle时间戳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!