5

EF を使用して、顧客のシステムにインストールされているレガシー SQL Server データベースにアクセスすることを検討しています。

問題は、データベース スキーマが 100% 一貫していないことです。それらはすべて同じ (関連する) テーブルとフィールドを持っていますが、一部の数値フィールドは異なるデータ型を持っている可能性があります。

私が見る限り、これらのタイプはアプリケーションの観点からは「互換性があります」: たとえば、小さい数字を含むフィールドsmallintは顧客 A のデータベースにあるかもしれませんが、int顧客 B のデータベースにあるかもしれません。または、価格を含むフィールドは、decimal(10,2)A のデータベースではfloat、B のデータベースでは (そうです、つまり、B は浮動小数点の問題に悩まされる可能性があります。つまり、これはレガシー データベースなのです)。

データベースにアクセスしているのは私たちだけではないため、スキーマを変更する (つまり統合する) ことはできません。Entity Framework はそれに対処できますか (つまり、doubleモデル定義が a であると主張した場合、SQL Server テーブルで a を適切に受け入れるdecimal(10,2)でしょうか)、それとも恐ろしくクラッシュしますか?

4

2 に答える 2

3

StackOverflow を見ると、データベース内の 1 つのデータ型を別のデータ型にマップする方法を尋ねる多くの質問が見つかります。

ブールへのショート

「Y」/「N」から true/false

データベースの文字列からブール値のプロパティに変換するEntity Framework 4.1

time(0) から DateTime

ほとんどの場合、解決策はエンティティに 2 つのフィールドを持ち、明示的な変換を行うコードを使用することです。

を使用して少数の DataTypes をマップFluentAPIできます。カスタム コードを最初に使用することもできます。

datetime2 から DateTime

あなたsmallintintこのカテゴリに分類されますが、そうではないと確信floatしてdecimal(10, 2)います。

あなたの問題は、異なるデータ型を持つ複数のデータベースを持つことで悪化するため、EF だけではうまく機能しないと思います。

あなたが試すことができる2つのことを考えることができます:

データ型を一貫してマップする各データベースにビューを作成し、ビューからエンティティ フレームワークをリバース エンジニアリングします。また、CUD をストアド プロシージャにマップし、データベースごとに作成および更新 SQL を変更して、データ型を変換する必要があります。

また

SQLをより細かく制御し、そこで変換を行うDapperを見てください。この回答EF + Dapper Hybrid Implementationには、リポジトリ パターンのハイブリッド実装へのリンクがあります。

于 2013-11-27T12:06:51.700 に答える
0

Entity Framework はそれに対処できますか (つまり、モデル定義で decimal(10,2) であると主張されている場合、SQL Server テーブルで double を適切に受け入れるでしょうか)、または恐ろしくクラッシュしますか?

エンティティ フレームワークはクエリを実行する前に必要なすべての変換を行い、浮動小数点から 10 進数への暗黙的な変換はないため、コンパイル時に検出して明示的な変換を行う必要があるため、問題は発生しないと思います。

于 2013-11-27T11:37:21.900 に答える