Entity Framework 甲骨文时间戳
Entity Framework Oracle Timestamp
我们有 T_SC_SERVICE
table,其中 INSTANCE_ID
列在 Oracle 中是 Timestamp(6)
类型。
我正在使用 .NET Framework 4.5、Entity Framework 6 和数据库优先方法。
我正在尝试使用 LINQ 从这个 table 添加和 Select 项。
使用 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
这是我的问题:
Select 与 LINQ 如下所示:
internal Service GetServiceByInstanceId(DateTime instanceId)
{
return this.ObjectSet.FirstOrDefault(i => i.InstanceId == instanceId);
}
LINQ 生成 SQL,如下所示。 如您所见,Instance_ID 是作为日期而不是日期时间发送的。所以它总是 return 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" />
我联系了 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();
编辑:
“此错误已在 ODP.NET 19.6 及更高版本中修复。”如 oracle 错误线程中所述。
我们有 T_SC_SERVICE
table,其中 INSTANCE_ID
列在 Oracle 中是 Timestamp(6)
类型。
我正在使用 .NET Framework 4.5、Entity Framework 6 和数据库优先方法。
我正在尝试使用 LINQ 从这个 table 添加和 Select 项。
使用 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
这是我的问题:
Select 与 LINQ 如下所示:
internal Service GetServiceByInstanceId(DateTime instanceId)
{
return this.ObjectSet.FirstOrDefault(i => i.InstanceId == instanceId);
}
LINQ 生成 SQL,如下所示。 如您所见,Instance_ID 是作为日期而不是日期时间发送的。所以它总是 return 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" />
我联系了 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();
编辑:
“此错误已在 ODP.NET 19.6 及更高版本中修复。”如 oracle 错误线程中所述。