質問: 私はEF6 Oracle.ManagedDataAccess v18.3.0、データベースの最初の概念(edmx)を使用しています。問題は、Oracleテーブルが、より高い精度(38桁)を持つ数値、つまり、Oracle数値がマップされるデフォルトのDecimal C#データ型を格納することです。 10進数の精度は最大28〜29桁です。そのため、OracleManagedDataAccessプロバイダーは以下の例外をスローします。 > Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i)at System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.ReadDecimal(DbDataReader reader、Int32 ordinal)at System.Data.Entity.Core.Objects.Internal。 ShapedBufferedDataRecord.Initialize(DbDataReader reader、DbSpatialDataReader spatialDataReader、Type [] columnTypes、Boolean [] nullableColumns)at System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.Initialize(String providerManifestToken、DbProviderServices columnReaderTypeType、ServiceReaderTypeType、ServiceReaderType、ServiceReaderType、ServiceReaderType System.Data.Entity.Core.Objects.Internal.BufferedDataReader.Initialize(String providerManifestToken、DbProviderServices providerServices、Type [] columnTypes、Boolean [] nullableColumns)のSystem.Data.Entity.Core.Objectsの、Boolean [] nullableColumns)。 System.Data.Entity.Core.Objects.ObjectQuery `1.<>c__DisplayClassb.b__a() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func` Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext context、ObjectParameterCollection parameterValues) `1.<>c__DisplayClassb.b__a() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func` 1 func、IDbExecutionStrategy executionStrategy、Boolean startLocalTransaction、Boolean releaseConnectionOnSuccess)の`1.<>c__DisplayClassb.b__a() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func` 。 ObjectQuery `1.<>c__DisplayClassb.b__9() at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func` 1 operation)at System.Data.Entity.Core.Objects.ObjectQuery `1.GetResults(Nullable` 1 forMergeOption)at System.Data.Entity.Core.Objects.ObjectQuery `1..GetEnumerator>b__0() at System.Lazy` ()at System.Lazy `1.LazyInitValue() at System.Lazy` ()at System.Lazy `1.LazyInitValue() at System.Lazy` 1.get_Value()at System.Data.Entity.Internal.LazyEnumerator `1.MoveNext() at System.Linq.Enumerable.First[TSource](IEnumerable` 1 source)at System.Data.Entity.Core .Objects.ELinq.ObjectQueryProvider.b__0 [TResult](IEnumerable `1 sequence) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable` System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute [TResult](Expression expression)at System.Data.Entity.Internal.Linq.DbQueryProvider.Executeで`1 sequence) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable` 1クエリ、Expression queryRoot) [TResult](式式)at System.Linq.Queryable.First [TSource](IQueryable`1 source)at TransakcijskiCertifikatGOTS.Program.Main(String [] args)in C:\ Users \ sl0gas \ Desktop \ JiraRepo \ Proizvodnja \ TransportniCertifikatiGOTS \ TransakcijskiCertifikatGOTS \ TransakcijskiCertifikatGOTS \ Program.cs:line 34 > > **この問題を解決するための既知の回避策はありますか?これまでのところ私はこれを試しました:** 1. edmxファイルで問題を引き起こしている特定のメンバーの精度を28に設定します。 2. App.configを以下の構成に変更し、さまざまなオプションを試す ``` ``` 3. デフォルトのキャストをDecimalから文字列に変更して、手動でDecimalまたはdoubleに変換できるようにしましたが、プロバイダーが無効なキャスト例外をスローしました。 LINQ構文を使用してデータベースをクエリしています!
回答: この問題は、関数呼び出しとテーブルで発生しました。テーブル列については、.NETタイプをdoubleに変更して変換を処理しました。これまでのところ、精度の問題はありません。 関数呼び出しの私の回避策は次のとおりです。 ``` var command = "some_oracle_function(:first_parameter)"; var xx = context.Database.SqlQuery(command, firstParameter).SingleOrDefault(); var oracleDecimal = new OracleDecimal(xx); return oracleDecimal.IsNull ? 0 : OracleDecimal.SetPrecision(oracleDecimal, 28).Value ``` 文字列として応答を強制し、新しいOracleDecimalを生成します-これにより、大きなオーバーフローする10進数が許可されます。次に、それを.NETフレームワーク内の処理可能なサイズにキャストし、有効な10進数値を返します。これはしばらくの間、問題なく動作しました。