延迟加载字段EF 5. 0(代码优先)的最佳做法是什么?

时间:2013-10-17 13:28:20

标签: c# ef-code-first single-table-inheritance

我的模型中有两个主要实体。报告(也是报告表)和ReportFolder(也是表格)

 [DataContract(IsReference = true)]
    public partial class Report
    {
        public Report()
        {
            this.DataSources = new List<DataSource>();
            CreationDate = DateTime.Now;

        }
        [DataMember]
        public long Id { get; set; }
        [DataMember]
        public long ReportFolderId { get; set; }
        [DataMember]
        public virtual ReportFolder ReportFolder { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string ReportContent { get; set; }
......

    }
[DataContract(IsReference = true)]
public partial class ReportFolder
{
    public ReportFolder()
    {
        this.Reports = new List<Report>();
        this.Folders = new List<ReportFolder>();
        CreationDate = DateTime.Now;
    }

    [DataMember]
    public long Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Description { get; set; }
    [DataMember]
    public long? ParentId { get; set; }
    [DataMember]
    public virtual ICollection<Report> Reports { get; set; }
    [DataMember]
    public virtual ICollection<ReportFolder> Folders { get; set; }
.....
}

所以问题是,我在两个场景中使用我的报告,在一个我需要在这个场景中加载所有带有Reports的ReportFolders我不想加载ReportContent(它是一个沉重的文件)。 在另一种情况下,我想加载并保存包含所有字段的报告。 基于我的搜索实体框架不支持部分加载字段。

然后我决定继承表单Report并创建另一个名为ReportWithContent的类,并在此类映射ReportContent字段中(也删除此字段的Report类)并在不同的场景中使用这两个类(将一个表单客户端发送到服务器并响应另一个客户端,以防止大量数据传输)但我没有成功它需要一个我没有的鉴别器(EF例外)。 我想在没有映射ReportContent的情况下报告,在这种情况下我应该使用什么操作ReportContent我将不得不使用普通的Sql,我不知道这是一个好习惯。

1 个答案:

答案 0 :(得分:1)

使用EF延迟加载基本属性是不可能的。所有原始属性都会自动加载。

解决方案是将报表的内容包装在另一个实体中,并使用此实体而不是Report类中的字符串属性。

public class ReportContent {
    public int ID { get; set; }
    public string Text { get; set; }
}

public class Report {
    ...
    public virtual ReportContent Content { get; set; }
    ...
}