具有Entity Framework的Oracle数据库10g到.Net类型

时间:2014-04-18 15:37:07

标签: c# oracle entity-framework

我在这个Oracle提供商中使用EF5:

<DbProviderFactories>
  <remove invariant="Oracle.DataAccess.Client" />
  <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0,             Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>

我的列名为BSO_KEYI,类型为Number(10)。 我试图将这种类型用于我的POCO。

生成了以下请求:

SELECT
"Limit1"."C1" AS "C1",
"Limit1"."C2" AS "C2",
"Limit1"."C3" AS "C3",
"Limit1"."C4" AS "C4",
"Limit1"."BSO_TYPEVC" AS "BSO_TYPEVC",
"Limit1"."C5" AS "C5",
"Limit1"."C6" AS "C6",
"Limit1"."BSO_TITLE_ALTERNATIVEVC" AS "BSO_TITLE_ALTERNATIVEVC",
"Limit1"."BSO_TITLE_BROADCASTVC" AS "BSO_TITLE_BROADCASTVC",
"Limit1"."BSO_TITLE_ORIGINALVC" AS "BSO_TITLE_ORIGINALVC",
"Limit1"."BSO_TITLE_PRESSVC" AS "BSO_TITLE_PRESSVC",
"Limit1"."BSO_APPROX_LENGTHVC" AS "BSO_APPROX_LENGTHVC",
"Limit1"."C7" AS "C7",
"Limit1"."LAST_MODIFICATION_DATEDT" AS "LAST_MODIFICATION_DATEDT",
"Limit1"."CREATION_DATEDT" AS "CREATION_DATEDT"
FROM ( SELECT
    "Extent1"."BSO_TYPEVC" AS "BSO_TYPEVC",
    "Extent1"."BSO_TITLE_ALTERNATIVEVC" AS "BSO_TITLE_ALTERNATIVEVC",
    "Extent1"."BSO_TITLE_BROADCASTVC" AS "BSO_TITLE_BROADCASTVC",
    "Extent1"."BSO_TITLE_ORIGINALVC" AS "BSO_TITLE_ORIGINALVC",
    "Extent1"."BSO_TITLE_PRESSVC" AS "BSO_TITLE_PRESSVC",
    "Extent1"."BSO_APPROX_LENGTHVC" AS "BSO_APPROX_LENGTHVC",
    "Extent1"."LAST_MODIFICATION_DATEDT" AS "LAST_MODIFICATION_DATEDT",
    "Extent1"."CREATION_DATEDT" AS "CREATION_DATEDT",
     CAST( "Extent1"."BSO_KEYI" AS number(19,0)) AS "C1",
     CAST( "Extent1"."BSO_TYPEI" AS number(19,0)) AS "C2",
     CAST( "Extent1"."BSO_NUMERATION_BROADCASTI" AS number(19,0)) AS "C3",
     CAST( "Extent1"."BSO_NUMERATION_MASTERI" AS number(19,0)) AS "C4",
     CAST( "Extent1"."BSO_MASTER_KEYI" AS number(19,0)) AS "C5",
     CAST( "Extent1"."BSO_MASTER_SCHEDULE_KEYI" AS number(19,0)) AS "C6",
     CAST( "Extent1"."LAST_MODIFICATION_UIDI" AS number(19,0)) AS "C7"
    FROM "Foo"."XO_BS_OBJECT" "Extent1"
    WHERE (( CAST( "Extent1"."BSO_KEYI" AS number(19,0))) = :p__linq__0) AND (ROWNUM <= (2) )
)  "Limit1"

之后我尝试了int并生成了以下请求

SELECT
"Limit1"."C1" AS "C1",
"Limit1"."C2" AS "C2",
"Limit1"."C3" AS "C3",
"Limit1"."C4" AS "C4",
"Limit1"."BSO_TYPEVC" AS "BSO_TYPEVC",
"Limit1"."C5" AS "C5",
"Limit1"."C6" AS "C6",
"Limit1"."BSO_TITLE_ALTERNATIVEVC" AS "BSO_TITLE_ALTERNATIVEVC",
"Limit1"."BSO_TITLE_BROADCASTVC" AS "BSO_TITLE_BROADCASTVC",
"Limit1"."BSO_TITLE_ORIGINALVC" AS "BSO_TITLE_ORIGINALVC",
"Limit1"."BSO_TITLE_PRESSVC" AS "BSO_TITLE_PRESSVC",
"Limit1"."BSO_APPROX_LENGTHVC" AS "BSO_APPROX_LENGTHVC",
"Limit1"."C7" AS "C7",
"Limit1"."LAST_MODIFICATION_DATEDT" AS "LAST_MODIFICATION_DATEDT",
"Limit1"."CREATION_DATEDT" AS "CREATION_DATEDT"
FROM ( SELECT
    "Extent1"."BSO_TYPEVC" AS "BSO_TYPEVC",
    "Extent1"."BSO_TITLE_ALTERNATIVEVC" AS "BSO_TITLE_ALTERNATIVEVC",
    "Extent1"."BSO_TITLE_BROADCASTVC" AS "BSO_TITLE_BROADCASTVC",
    "Extent1"."BSO_TITLE_ORIGINALVC" AS "BSO_TITLE_ORIGINALVC",
    "Extent1"."BSO_TITLE_PRESSVC" AS "BSO_TITLE_PRESSVC",
    "Extent1"."BSO_APPROX_LENGTHVC" AS "BSO_APPROX_LENGTHVC",
    "Extent1"."LAST_MODIFICATION_DATEDT" AS "LAST_MODIFICATION_DATEDT",
    "Extent1"."CREATION_DATEDT" AS "CREATION_DATEDT",
     CAST( "Extent1"."BSO_KEYI" AS number(10,0)) AS "C1",
     CAST( "Extent1"."BSO_TYPEI" AS number(19,0)) AS "C2",
     CAST( "Extent1"."BSO_NUMERATION_BROADCASTI" AS number(19,0)) AS "C3",
     CAST( "Extent1"."BSO_NUMERATION_MASTERI" AS number(19,0)) AS "C4",
     CAST( "Extent1"."BSO_MASTER_KEYI" AS number(19,0)) AS "C5",
     CAST( "Extent1"."BSO_MASTER_SCHEDULE_KEYI" AS number(19,0)) AS "C6",
     CAST( "Extent1"."LAST_MODIFICATION_UIDI" AS number(19,0)) AS "C7"
    FROM "Foo"."XO_BS_OBJECT" "Extent1"
    WHERE (( CAST( "Extent1"."BSO_KEYI" AS number(10,0))) = :p__linq__0) AND (ROWNUM <= (2) )
)  "Limit1"

正如您在类型long中看到的那样,EF将列强制转换为NUMBER(19,0),并且对于int,在数据库Number(10,0)中有相同类型的强制转换。 演员是否打破了此列的索引?有没有更好的.Net类型?

2 个答案:

答案 0 :(得分:0)

据我所知,Number(x,y)的自然映射是十进制(或float,double)。至于你的&#34;演员会忽略索引&#34;质疑数据库应该足够聪明才能使用它。

答案 1 :(得分:0)

最后我们切换到Devart提供程序,它的工作方式更好(相同的C#类型,但不生成强制转换)。 我们从3s过了0.4s。