2

EF5 edmx ファイルで 2 レベルの継承階層が定義されています。

クラス構造の簡単な例:

A -> B
A -> C
A -> D -> E
A -> D -> F

太字のクラスは抽象 (mustinherit) です。

クラス A は、他のすべてのクラスで使用されるいくつかのプロパティを定義し、各クラスは独自のデータを追加します。

テーブルには 2 つの識別子の列があり、1 つはマッピングの最初のレベル (A -> B、C、または D) 用で、もう 1 つは 2 番目のセット (D -> E または F) 用です。

edmx にはエラーがなく、コードは正常に実行されます。任意の (非抽象) クラスをインスタンス化し、データベースにクエリを実行して、各クラスのすべてのデータを正しく戻すことができます。

ただし、データベースに新しいレコードを作成しようとすると、最下位レベルのクラス (E および F) に設定されたプロパティがテーブルに保存されません。

これが私が実行するコードの例です(VB、申し訳ありません):

Dim _base as A
Select case condition
    Case E
        dim _concrete as E = _context.A.Create(of E)
        _concrete.UniqueProperty = "Value"
        _base = _concrete
End Select

_base.BaseLevelProperty = "AnotherValue"

_context.Versions.Add(_base)
If _context.GetValidationErrors.Count > 0 Then Throw New Exception("context errors")
_context.SaveChanges()

もちろん、さまざまな具象クラスにはさらに多くのケースがあります。

これは B と C で正常に機能し、一意の基本プロパティがデータベースに保存されます。ただし、E または F の場合、呼び出される直前にオブジェクトにプロパティが設定されているにもかかわらずsavechanges、それらの値はデータベースに入力されず、データがあるべき列に NULL のみが表示されます。

奇妙なことに、これらの列の 1 つに手動でデータを入力し、たとえばすべてのオブジェクトについてデータベースにクエリを実行すると、TypeOf E手動で入力したデータが正しく取得されます。

これは私のマッピングが正しいことを示していますよね? なぜデータはある方向に行き、別の方向には行かないのでしょうか?

より複雑なバージョンがこの質問で説明されているため、これが可能であることはわかっていますが、私の問題とは何の関係もありません。

4

0 に答える 0