在 EF 中急切加载相关实体很容易。
但是我在使用 table-per-type 模型加载数据时遇到了包括继承实体在内的困难。
这是我的模型:
实体:
ArticleBase
(基础物品实体)ArticleSpecial
(继承自ArticleBase
)
UserBase
(基本用户实体)UserSpecial
(继承自UserBase
)
Image
实际上,我的用户总是 type UserSpecial
,因为UserBase
在另一个应用程序中使用,因此我们可以共享凭据。这是我有两个单独的表的唯一原因。UserBase
表格不能以任何方式更改形状或形式,因为其他应用程序会损坏。
问题
我应该如何加载ArticleSpecial
两者CreatedBy
并EditedBy
设置,以便两者都是类型UserSpecial
(定义Image
关系)?
我已经尝试过(虽然没有成功)这些选项:
1. 使用 lambda 表达式:
context.ArticleBases
.OfType<ArticleSpecial>()
.Include("UserCreated.Image")
.Include("UserEdited.Image");
在这种情况下,问题在于两者CreatedBy
和EditedBy
都与 相关UserBase
,这没有定义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 结果,但它们不会将实体加载到上下文中(我想)。