如何仅在需要时加载Entity Framework Self Track TrackableCollection <t>关系数据?</t>

时间:2011-08-17 16:16:02

标签: winforms c#-4.0 entity-framework-4 lazy-loading self-tracking-entities

我使用Entity Framework 4和Self Tracking Entities。架构如下:

患者 - &gt;考试 - &gt; LeftPictures                          - &GT; RightPictures

所以有TrackableCollection这两种关系患者1 - * ....图片。 现在,在加载客户表单和浏览详细信息时,我不需要加载这些 数据图像,仅在为考试详细信息加载另一个表单时!

我使用类库作为数据存储库来从数据库(SQL Server)和此代码中获取数据:

public List<Patient> GetAllPatients()
{
    try
    {
        using (OptoEntities db = new OptoEntities())
        {
            List<Patient> list = db.Patients
                .Include("Addresses")
                .Include("PhoneNumbers")
                .Include("Examinations").ToList();

            list.ForEach(p =>
                             {
                                 p.ChangeTracker.ChangeTrackingEnabled = true;

                                 if (!p.Addresses.IsNull() &&
                                     p.Addresses.Count > 0)
                                     p.Addresses.ForEach(a => a.ChangeTracker.ChangeTrackingEnabled = true);

                                 if (!p.PhoneNumbers.IsNull() &&
                                     p.PhoneNumbers.Count > 0)
                                     p.PhoneNumbers.ForEach(a => a.ChangeTracker.ChangeTrackingEnabled = true);

                                 if (!p.Examinations.IsNull() &&
                                     p.Examinations.Count > 0)
                                     p.Examinations.ForEach(e =>
                                                                {
                                                                    e.ChangeTracker.ChangeTrackingEnabled = true;

                                                                });
                             });

            return list;
        }
    }
    catch (Exception ex)
    {
        return new List<Patient>();
    }
}

现在我需要在调用考试详细信息表格时获取考试关系的所有图像(LeftEyePictures,RightEyePictures)。我猜这叫做Lazy Loading,我不知道如何在我实时关闭实体连接时让它发生,我想保持这样。

我在应用程序中使用BindingSource组件。

获得所需结果的最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

自我跟踪实体不支持延迟加载。此外,延迟加载仅在实体附加到实时上下文时才起作用。您无需立即关闭/处置上下文。在WinForms的情况下,应用程序上下文通常会存在更长的时间(您可以按照每个表单一个上下文或每个演示者方法一个上下文)。

WinForms应用程序是普通附加实体的场景,其中所有这些功能(如延迟加载或更改跟踪)都是开箱即用的。 STE应该用于分布式系统,您需要序列化实体并将其传递给另一个应用程序(通过Web服务调用)。