如何加载所有相关的EF实体以准备序列化

时间:2015-06-17 00:46:22

标签: entity-framework serialization lazy-loading eager-loading

有人能告诉我如何(优雅地)加载所有相关的实体对象以准备序列化到磁盘吗?

我有一个表会话。会话可以具有记录表中的多个记录。此外,每个Recording可以有多个RecordedFiles,它们位于RecordedFiles表中。

EF类看起来像这样(简称为简称):

[Serializable]
public partial class Session
{
    public Session()
    {
       this.Notes = new HashSet<Note>();
        this.Recordings = new HashSet<Recording>();
    }

    public System.Guid SessionGUID { get; set; }
     public int SessionNum { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
   public virtual ICollection<Recording> Recordings { get; set; }
}

[Serializable]
public partial class Recording
{
    public Recording()
    {
        this.RecordedFiles = new HashSet<RecordedFile>();
         this.ProcessedFiles = new HashSet<ProcessedFile>();
    }

    public System.Guid RecordingGUID { get; set; }
    public int RecordingNumber { get; set; }
    public System.Guid SessionGUID { get; set; }
     public virtual ICollection<ProcessedFile> ProcessedFiles { get; set; }   
    public virtual ICollection<RecordedFile> RecordedFiles { get; set; }
    public virtual Session Session { get; set; }
   }

最初,我使用的是Lazy Loading,通过反复试验我注意到我无法序列化所有内容,除非我在序列化之前碰巧在调试器中扩展了集合。这是有道理的:使用延迟加载,实体在需要之前不会被拉出。但很明显,我无法一步一步完成调试器并执行此操作!我的下一个想法是使用&#34; Eagerly Loading&#34;。例如,请参阅https://msdn.microsoft.com/en-US/data/jj574232。但是如果你看一下这个,你就会发现你需要拥有&#34;包含&#34;声明。我相信我必须有多个包含语句(参见:Loading all the children entities with entity framework)来涵盖Session(Recordings&amp; Notes)中的不同分支。而且情况甚至比我表现的还要糟糕:会议中有多个分支机构,而且它们比我更加深入。也就是说,一个Session可能有一个Recordings集合,而这些集合又有一个RecordedFiles集合,反过来等等。

如果我必须写一些丑陋的表达,如:      会话会话= context.Sessions.Include(&#34; Recordings.RecordedFiles&#34;)。包括(&#34; Recordings.ProcessedFiles&#34;)。包括(&#34; Equipment.StereoEquipment&#34;)。包括(&#34;注释&#34;)。其中(p =&gt; p.GUID == ####)。FirstOrDefault();

我会的。但是我猜是有一些优雅的方式可以说,&#34;加载与这个给定Session#34;相关的所有实体。有人可以开导我吗?请注意,在上面的怪物中我都包括&#34; Recordings.RecordedFiles&#34;和&#34; Recordings.ProcessedFiles&#34;。也就是说,Session有一系列录音。每个Recording都有RecordedFiles和ProcestedFiles的集合。如果说&#34; Include Recordings。{all sub collections}

那就太好了

谢谢,

戴夫

编辑:我应该指出避免多重&#34;的另一个原因包括&#34;如果数据库发生更改(例如,在“记录”下有另一个表或集合),则必须重写代码。可能很难跟踪它。

1 个答案:

答案 0 :(得分:0)

我担心没有内置的方法来做你想做的事。您可以使用反射执行某些操作,您可以枚举所有属性并自行加载它们。像这样:

How can I recursively Include ALL navigable properties to emulate Lazy Loading