【发布时间】:2010-02-23 11:03:58
【问题描述】:
在 EF 急切加载相关实体是easy。
但在使用 table-per-type 模型加载数据时,我遇到了包括继承实体的困难。
这是我的模型:
实体:
-
ArticleBase(基础文章实体)-
ArticleSpecial(继承自ArticleBase)
-
-
UserBase(基本用户实体)-
UserSpecial(继承自UserBase)
-
Image
实际上,我的用户总是UserSpecial 类型,因为UserBase 在另一个应用程序中使用,因此我们可以共享凭据。这是我有两个单独的表的唯一原因。 UserBase table 不能以任何方式改变形状或形式,因为其他应用程序会崩溃。
问题
我应该如何加载 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 结果,但它们不会将实体加载到上下文中(我想)。
【问题讨论】:
-
我的回答对您的问题有帮助吗?
标签: entity-framework inheritance join eager-loading