1

在 WCF Web 服务中,我对 ORACLE 11g 数据库进行查询,并使用实体框架作为模型。目标字段是 Numeric 类型,而在实体框架中是 Int64。

当我尝试更新该字段时,出现以下异常:从具体化的“System.Decimal”类型到“System.Int64”类型的指定转换无效。 产生错误的方法如下,特别是 else 语句中的行:result = _context.ExecuteStoreQuery(query).FirstOrDefault();

public string GetDatabaseTimestamp(Type timestampFieldType, string query)
{
    object result;

    if (timestampFieldType == typeof(string))
    {
        result = _context.ExecuteStoreQuery<string>(query).FirstOrDefault();
    }
    else
    {
        result = _context.ExecuteStoreQuery<long>(query).FirstOrDefault();
    }

    return result.ToString();
}

是否可以在 EF 级别定义转换器或类似的东西?更改数据库的选项不可行,因此我必须编辑代码。

4

1 回答 1

1

在 EF 中,我已经将类型更改为十进制。问题是查询是直接在 Oracle 数据库上执行的,这会产生异常。

我通过使用目标实体的属性解决了这个问题,并将方法更改为:

public string GetDatabaseTimestamp(Type timestampFieldType, string query) 
{ 
 object result; 

if (timestampFieldType == typeof(string)) 
{ 
  result = _context.ExecuteStoreQuery<string>(query).FirstOrDefault(); 
} 
else if (timestampFieldType == typeof(decimal)) 
{ 
  result = _context.ExecuteStoreQuery<decimal>(query).FirstOrDefault(); 
} 
else 
{  
  result = _context.ExecuteStoreQuery<long>(query).FirstOrDefault(); 
} 

return result.ToString(); 
} 

这样,传递的 timestampFieldType 是十进制类型,并且选择了正确的强制转换。此问题是由于 Oracle DB(遗留数据库)中的类似字段(例如更新字段)使用了不同的数据类型。

于 2012-07-23T13:41:36.650 回答