Oracle DB到EF无法正常使用NUMBER(2,0)

时间:2017-10-05 15:51:57

标签: c# oracle entity-framework

我有一个像这样定义的表格列:

ENTRY_STATUS NUMBER(2, 0) 

在我的EntityFramework类中,相应的字段定义如下:

[Column("ENTRY_STATUS")]
public int Status { get; set; }

检查值以获取条目时,它可以正常工作:

var order = testDbContext.Orders.FirstOrDefault(o => o.Status > 1);

但是当我在这个陈述之后检查order实体时,它总是为零:

if (order != null)
{
    if (order.Status == 3) //Always Zero!!!
    { //Do something... 
    }
}

我的定义出了什么问题?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

.Net Int32的Oracle数据库列应为:NUMBER(9, 0)

根据Conversion Table

+------------------------------+------------------+-----------------+
|         Oracle Type          | Default EDM Type | Custom EDM Type |
+------------------------------+------------------+-----------------+
| Number(1,0)                  | Int16            | bool            |
| Number(2,0) to Number(3,0)   | Int16            | byte            |
| Number(4,0)                  | Int16            | Int16           |
| Number(5,0)                  | Int16            | Int32           |
| Number(6,0) to Number(9,0)   | Int32            | Int32           |
| Number(10,0)                 | Int32            | Int64           |
| Number(11,0) to Number(18,0) | Int64            | Int64           |
| Number(19,0)                 | Int64            | Decimal         |
+------------------------------+------------------+-----------------+

修改

我找到了一种方法可以强制将Number(2,0)转换为App.Config 中用于数据库优先方法的字节:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
  </connectionStrings>
  <oracle.dataaccess.client>
    <settings>
      <add name="bool" value="edmmapping number(1,0)" />
      <add name="byte" value="edmmapping number(3,0)" />
      <add name="int16" value="edmmapping number(4,0)" />

参考:https://docs.oracle.com/database/121/ODPNT/entityDataTypeMapping.htm#ODPNT8300

答案 1 :(得分:1)

查询

var order = testDbContext.Orders.FirstOrDefault(o => o.Status > 1);

在服务器上执行,因此它返回例外结果。

然后创建Order实体,EF尝试将ENTRY_STATUS列的值从number(2,0)映射到Int32,这是不可能的。

在我看来,最佳解决方案是将Status的类型更改为Int16

[Column("ENTRY_STATUS")]
public Int16 Status { get; set; }

答案 2 :(得分:0)

这是一个缓存问题 以下文章帮助我:http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/

我不知道这是一个EF错误,查询本身(o => o.Status > 1)是否识别出数据库中的更改,而不是从缓存中检索数据,这可能是不同的。
无论如何,添加AsNoTracking()解决了这个问题:

var order = testDbContext.Orders.AsNoTracking().FirstOrDefault(o => o.Status > 1);