【问题标题】:Cast between Oracle Table field and Entity framework failsOracle 表字段和实体框架之间的转换失败
【发布时间】:2013-04-05 19:08:27
【问题描述】:

在 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 级别定义转换器或类似的东西?更改数据库的选项不可行,因此我必须编辑代码。

【问题讨论】:

  • 能否在您的 EF 模型中将数据类型更改为 decimal

标签: visual-studio-2010 wcf entity-framework-4 casting oracle11g


【解决方案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(旧数据库)中类似字段(例如更新字段)使用的不同数据类型造成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多