我提出的另一个实体框架(ADO.NET)问题.
我正在使用EF1(那里没有选择),并且有一个MySQL数据库作为后端.
一个简单的问题我真的找不到令人满意的答案:
加载到底需要做什么? IE.,当我有一个实体并想通过其子对象枚举时,说我有一个实体“ Group”,并且它有一个子代“ User”,我想从g.Users中的n中进行“ n.UserID = 4选择n“,我首先要调用g.Users.Load();
这有点烦人,因为当我对未加载的集合进行查询时,我希望EF自动加载它-至少会抛出一些异常,而不仅仅是返回0结果吗?
我不得不处理加载的另一种情况:
我有一个查询:
from n in Users where n.Group.Name == "bla" select n
由于某些原因,即使正确设置了n.GroupID(组的键),它也无法为n.Group提供空指针.同样,当我之前做Server.Groups.Load()(组是一台服务器的子级)时,它也可以工作.
关于何时调用哪个集合的Load()是否有确切的政策?
再次感谢你,
麦可
最佳答案
在第一个版本的实体框架中没有延迟加载.每当您要访问以前未加载的内容时,无论是对单个对象还是对象集合的引用,都必须明确地告诉它加载该引用. Include()选项(来自上面Rup的第一个选项)将尝试在一个大型查询和处理调用中加载所需的所有数据,结果是Include()执行缓慢.另一种方法(上面的Rup中的第二种方法),检查然后加载卸载的引用,执行速度更快,并且使我们能够将加载限制到所需的范围.
基本上,我们的策略是仅加载您在初始查询中必须执行的操作,以最大程度地降低性能影响.然后,当我们想访问引用的实体或实体集合时,我们将在以后检查并加载引用.这导致对数据库的查询增多,但是查询速度更快,并且我们仅在需要时加载辅助数据,而不是预加载我们可能需要的所有内容.在一个函数中,相同的属性可能会被检查两次,但是它只会被加载一次,并且我们可以确定我们只是在加载它,因为我们正在使用它.