2013-10-17 37 views
0

我的模型中有兩個主要實體。報告(也報告表)和ReportFolder(也表)延遲加載字段EF 5. 0(CodeFirst)的最佳做法是什麼?

[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; } 
..... 
} 

所以,問題是,我用我在兩種情況下報告,在一個我需要加載所有的ReportFolders在這種情況下我不報告想要加載ReportContent(這是一個沉重的提交)。 在另一種情況下,我想加載並保存包含所有字段的報告。 基於我的搜索實體框架不支持部分加載字段。

然後,我決定繼承窗體Report並創建另一個名爲ReportWithContent的類,並在此類中映射ReportContent字段(也可以移除此歸檔窗體Report類),並在不同場景中使用這兩個類(發送一個表單客戶端到服務器並響應另一個給客戶端,以防止大量的數據傳輸),但我沒有成功,它需要一個我沒有的鑑別器(EF例外)。 我想在沒有映射ReportContent的情況下報告內容在這種情況下,無論我應該使用什麼行爲ReportContent我將不得不使用普通的Sql,我不知道這是一個好的做法。

回答

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; } 
    ... 
} 
+0

感謝 我寫我的實體POCO自己不要任何代碼遷移(表已經是在DB反向codefirst)我得到了錯誤 也許我應該放棄使用繼承,去表拆分(解決方案) – Mojtaba

+0

我曾想過繼承的概念,我意識到它不能工作。無法將表中的一行映射到兩個不同的實體。 –

+0

我想從Report中繼承Report和ReportWithContent,因此它們是在類型之間繼承的。那麼這意味着將父母和孩子映射到一張桌子是不可能的? – Mojtaba