我正在努力使用 ADO.NET 实体框架。这是我的 ER 图:
--------------------- ----------------- ---------------
| GrandParentEntity |<-------| ParentEntity |<-------| ChildEntity |
+-------------------+ 1 N +---------------+ 1 N +-------------+
| Id | | Id | | Id |
--------------------- | GrandParentFk | | ParentFk |
----------------- ---------------
对对象上下文的生命周期有疑问。假设我请求我的数据如下:
public static List<MyParentEntity> GetMyParentEntity()
{
using (var context = new MyObjectContext(blablabla...))
{
var resultSet = from e in context.MyParentEntitySet select e;
return resultSet.ToList();
}
}
我得到了我所有父实体的列表。一段时间后(几小时?),用户决定他想检查哪一个。(同时,实体对象通过了应用程序的多个层。)我现在必须加载记录的所有详细信息:
public static void LoadChildren(MyParentEntity pEntity)
{
using (var context = new MyObjectContext(blablabla...))
{
pEntity.GranParentEntityReference.Load();
pEntity.ChildEntites.Load();
}
}
这会导致 ObjectDisposedException,因为 MyParentEntity 对象已失去与创建它的对象上下文的连接。我有几种可能性来处理这个:
1) 我可以一直使用同一个 MyObjectContext 实例,并且永远不会关闭它。这会导致内存的巨大浪费。
2)每次离开“使用(上下文)”块时,我都可以手动分离()每个实体对象(及其子实体和父实体)。每次我输入一个新的“使用(上下文)”块时,我都可以附加()它们。导致很多努力。(我认为一个框架应该减少而不是增加它。)
3)每次我输入一个新的“使用(上下文)”块时,重新加载然后丢弃每个实体。导致 SQL Server 上的更多(不必要的)负载并且还浪费内存。
4)我可以在应用程序启动时加载所有详细信息和所有引用以及所有引用的所有引用以及这些引用的引用。(不讨论,这真的很傻!)
5) ...(我忘记了一个选项吗?)
现在你的大问题:我应该选择哪种方式?还有另一种我没有看到的方法吗?还是我完全误解了框架的精神?
提前致谢
更新:这是一个 Windows 窗体应用程序。