从数据库中选择浅层对象,从外键中删除所有引用

时间:2011-09-19 12:33:17

标签: entity-framework

在我的应用程序中,我经常从数据库中获取一些数据,自动将其序列化,然后将其发送到某个地方。

数据库结构非常复杂,但我们假设我有三个关系,A,B和C,其中B和C有外键指向A.因此,可以使用导航属性在这些关系之间导航(我喜欢这个功能,我不想禁用它。)

数据提取是使用Entity Framework完成的,所以我只是从一些ObjectContext中获取它。有一个MergeOptions.NoTracking选项设置。

我的数据序列化检查每个属性并以指定的方式保存它。我不想修改这种机制。

问题出现了,当我从中获取对象时,比方说,关系A. 我从数据库层返回它并将其传递给序列化。它试图访问对B和C的引用,但是当我们在对象上下文之外时,它无法完成。

我知道我可以做到以下几点:

AEntry a = db.A.FirstOrDefault(something);
a.BReference.Clear(); //(or .Load())
a.CReference.Clear();
return a;

但我不喜欢这个解决方案。我正在寻找一些可以让我保持'a'对象(或者可能是这些对象的集合)的东西,尽可能不实现,我不想打扰每一个参考(因为可能有很多他们)。

显然,在这种情况下,我不关心引用对象的内容(或引用我所获取的对象的对象)。

我希望我的问题很清楚。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我想你想要延迟加载。请参阅this question,设置ObjectContext的ContextOptions属性:

context.ContextOptions.LazyLoadingEnabled = false; 

或者,如果您使用的是.edmx模型,请设置LazyLoadingEnabled注释:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

当然,您必须确保明确加载 所需的数据(使用Include()上的ObjectQuery方法。