2

現在、エンティティフレームワークアプリケーションを約10年ほど前のレガシーデータベースと統合しようとしています。このデータベースが持つ多くの問題の1つ(関係や制約はありません)は、ほぼすべての列がnullに設定されていることです。ほとんどの場合、これは意味をなさないでしょう。null不可能な値をEntity Frameworkのnullable値に透明に変換する

常に、私はこれらの線に沿って例外が発生します:

「MyRecord」オン「SORTORDER」プロパティ

は「NULL」の値に設定することができませんでした。このプロパティを 'Int32'型のnull以外の値に設定する必要があります。

上記の例外を参照すると多くの質問がありましたが、これらはすべて、開発者がデータベース内のデータを適切に表すクラスを作成していない間違いのようです。私は意図的にデータベース内のデータを正しく表現していないクラスを作成したいと思います。私は、これがEntity Frameworkのルールに反していることを十分に認識しており、その理由はおそらく私がそれを行うことがそれほど難しいことです。

現時点では、既存のアプリケーションを破壊するため、スキーマを変更することはできません。新しいデータは古いアプリケーションによって挿入されるため、データを修正することもできません。 Entity Frameworkを使用してデータベースをマッピングしたいと思っています。今後数年間、すべてのアプリケーションをゆっくりと移動してデータアクセスに頼ることになり、最終的にデータベースの再設計フェーズに移行することができます。

internal int? SortOrderInternal { get; set; } 

public int SortOrder 
{ 
    get { return this.SortOrderInternal ?? 0; } 
    set { this.SortOrderInternal = value; } 
} 

私はその後、CodeFirstにフィールドをマップすることができます:

entity.Ignore(model => model.SortOrder); 
entity.Property(model => model.SortOrderInternal).HasColumnName("SortOrder"); 

をこの方法でinternalキーワードを使用して、私はこれを回避するために使用されている

一つの方法は、透過プロキシ変数をすることですこの不幸をうまくカプセル化して、データアクセスアセンブリの外に漏れないようにすることができます。

しかし残念ながら、私は今NotSupportedExceptionがスローされるようにクエリでプロキシフィールドを使用することができません:

指定された型のメンバーを「SORTORDER」エンティティにLINQではサポートされていません。初期化子、エンティティメンバー、エンティティナビゲーションプロパティのみがサポートされています。

おそらく、DbSetによって受信された表現を透過的に書き換えることは可能でしょうか?私はこれがうまくいくかどうか聞いてみたい。私は表現する樹木で十分に熟練していません。私はこれまでにDbSetのメソッドを見つけるのに失敗し、式を操作するためにオーバーライドすることができましたが、私はIDbSetを実装する新しいクラスを作成するのではなく、恐ろしいDbSetに渡します。

スタックトレースを調査しながら、私は内部のEntity Frameworkのコンセプトへの参照は、このコンセプトにグーグルでの迅速なビットにデータの入力、それを取るものであるように思われるシェイパーは、得られていないと呼ばました何か、しかし、System.Data.Entity.dllとdotPeekを調べると、これは確かに私を助ける何かになることを示しています... Shaper<T>が内部ではなく密封されていると仮定します。私は間違いなくここで間違った木を鳴らしていますが、誰かがこれに遭遇したかどうか聞いてみたいと思います。

+0

null可能なプロパティで作業したくない理由はありますか?データベーススキーマの限界を受け入れ、それに応じてコードを書くのではなく、データベースのスキーマと "戦う"ように感じているようです。 –

+0

興味深いことに、CSDL /モデルのプロパティで、エンティティプロパティをnull = falseにしないのはなぜですか?基になるSSDLはnull可能ですが、null以外の値も正しくマッピングされますが、DBのnullが検出された場合はConstraintException(yyyのXXXプロパティをnullプロパティに設定できません)を処理する必要があります – StuartLC

+0

@ AndrewStephensデータベースの設計方法ではないので、私はこれをしたくありません。たとえば、2つの異なるエンティティが同じテーブルに格納され、Entity Frameworkを使用して解決した状況もあります。私はアプリケーション層のデータを再解釈し、将来は可能な場合にはデータベースを修正したいと思います。 Entity Frameworkレイヤーのクラスでnull値を許可すると(実際にはほとんどすべてのフィールド、さらには外部キー)、私はこの問題を実際に解決していません。 –

答えて

関連する問題