EF では、関連するエンティティを積極的に読み込むのは簡単です。
しかし、table-per-type モデルを使用してデータをロードするときに、継承されたエンティティを含めることが困難です。
これは私のモデルです:
エンティティ:
ArticleBase
(基本物品エンティティ)ArticleSpecial
(から継承ArticleBase
)
UserBase
(ベース ユーザー エンティティ)UserSpecial
(から継承UserBase
)
Image
関係は画像に示されているとおりです (多くの列を省略しています)。
実際には、別のアプリケーションで使用されているUserSpecial
ため、私のユーザーは常にタイプであり、資格情報を共有できます。UserBase
それが、私が 2 つの別々のテーブルを持っている唯一の理由です。UserBase
他のアプリが壊れる可能性があるため、テーブルの形状を変更することはできません。
質問
両方が(関係を定義する) タイプになるように、ArticleSpecial
両方CreatedBy
とEditedBy
セットをロードするにはどうすればよいでしょうか?UserSpecial
Image
私は(失敗しましたが)これらのオプションを試しました:
1. ラムダ式の使用:
context.ArticleBases
.OfType<ArticleSpecial>()
.Include("UserCreated.Image")
.Include("UserEdited.Image");
この場合の問題は、 と の両方CreatedBy
がEditedBy
に関連していて、ナビゲーションUserBase
を定義していないことです。したがって、これら2つを次のようImage
にキャストする必要があります。UserSpecial
context.ArticleBases
.OfType<ArticleSpecial>()
.Include("UserCreated<UserSpecial>.Image")
.Include("UserEdited<UserSpecial>.Image");
もちろん、ジェネリックを使用しても機能しInclude("UserCreated<UserSpecial>.Image")
ません。
2. LINQ クエリを使用してみました
var results = from articleSpecial in ctx.ArticleBase.OfType<ArticleSpecial>()
join created in ctx.UserBase.OfType<UserSpecial>().Include("Image")
on articleSpecial.UserCreated.Id equals created.Id
join edited in ctx.UserBase.OfType<UserSpecial>().Include("Image")
on articleSpecial.UserEdited.Id equals edited.Id
select articleSpecial;
この場合ArticleSpecial
、関連するプロパティが設定されていないオブジェクト インスタンスのみを取得しています。どういうわけかそれらを選択する必要があることは知っていますが、方法がわかりませんか?
私のLINQの選択部分は、次のように変更できます
select new { articleSpecial, articleSpecial.UserCreated, articleSpecial.UserEdited };
しかし、画像はまだ私のコンテキストにロードされていません。この場合の私のジョインは、articleSpecial の結果を除外するためにほとんど使用されていませんが、エンティティをコンテキストにロードしません (私はそう思います)。