Entity framework 加载不包含()的相关对象
简单地说,我正在使用针对基类定义的存储库加载从基类派生的对象。尽管我的对象是使用正确的子类创建的,但是任何添加导航属性的子类(基类中不存在)都不会加载这些相关对象,并且我无法显式请求它们 下面是repository类中的一个简单方法,该方法加载给定的日历事件,前提是您知道其ID值:Entity framework 加载不包含()的相关对象,entity-framework,Entity Framework,简单地说,我正在使用针对基类定义的存储库加载从基类派生的对象。尽管我的对象是使用正确的子类创建的,但是任何添加导航属性的子类(基类中不存在)都不会加载这些相关对象,并且我无法显式请求它们 下面是repository类中的一个简单方法,该方法加载给定的日历事件,前提是您知道其ID值: public CalendarEvent GetEvent(int eventId) { using (var context = new CalendarEventDbContext
public CalendarEvent GetEvent(int eventId)
{
using (var context = new CalendarEventDbContext(ConnectionString))
{
var result = (from evt in context.CalendarEvents
where eventId.Equals((int)evt.EventId)
select evt).ToList();
return result.ToList()[0];
}
}
CalendarEvent
是一个基类,大量更具体的类从该基类派生而来。实体框架正确地确定由eventId
指定的日历事件的实际类,并构造并返回该派生类。这很好用
然而,现在我有了CalendarEvent
的后代,名为ReportIssued
。这个对象引用了另一个名为ReportRequest
(另一个CalendarEvent
的后代,尽管我认为这并不重要)
我的问题是,当实体框架代表我创建ReportIssued
的实例时,我总是希望它创建并加载ReportRequested
的相关实例,但因为我是在一般日历事件的上下文中创建事件,尽管我正确地返回了ReportIssued
事件,我无法指定.Include()
来获取相关对象。我想通过这个一般表示的搜索来实现这一点,因为我不一定知道eventId
的事件的类型,而且我还有几个其他的“Get”方法返回CalendarEvent
子体的集合
我使用Fluent API创建映射。我想我要寻找的是某种方式,在映射中,表达相关的对象总是需要的,或者,如果没有,某种表示相同概念的装饰器
我觉得奇怪的是,在保存对象时,实体框架总是遍历整个图形,而在加载对象时,它却没有做到相同的效果。您可以使用Include的字符串重载吗?不确定它是否有效,但可能是一个好的起点?另外,只需对您那里的代码进行注释-使用FirstOrDefault而不是ToList。FirstOrDefault将确保在数据库中使用SELECT TOP 1,而且该方法的实际作用更加明显!Dean:代码被简化了,如果没有返回任何内容,它实际上会检查并返回
null
。此外,我还尝试了字符串重载和实体框架检查基本类型,而不是最终实例化的类型,并且,唉,抛出了一个异常。唯一的选择是在返回之前检查该类型,并执行另一个查询以检索该特定类型的关系。。。很糟糕,但我认为你不能用任何其他方法来解决这个问题:(Slauma已经在这个问题上下了决心,但只取得了有限的成功。我们需要一个Include()
方法。