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

The EF では、型を 10 進数に変更しました。問題は、クエリが 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 は decimal 型であり、適切なキャストが選択されます。この問題は、Oracle DB (レガシー データベース) の同様のフィールド (更新フィールドの例) に使用される異なるデータ型が原因です。

于 2012-07-23T13:41:36.650 に答える