2013-10-17 1 views
0

J'ai deux entités principales dans mon modèle. Rapport (également le rapport tableau) et ReportFolder (également tableau)Quelle est la meilleure pratique pour charger paresseux un champ 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; } 
..... 
} 

Le problème est, je me sers de mon rapport dans deux scénarios, dans celui que je dois charger tous les ReportFolders des rapports dans ce scénario, je ne suis pas Vous voulez charger ReportContent (c'est un fichier lourd). Dans l'autre scénario, je veux charger et enregistrer un rapport avec tous les champs. D'après ma recherche, entityframework ne supporte pas les champs de chargement partiel. Puis j'ai décidé d'hériter du formulaire Report et de créer une autre classe appelée ReportWithContent et dans ce champ ReportContent de mapper de classe (également supprimer ce formulaire class Report class) et utiliser cette classe dans différents scénarios (envoi d'un client au serveur et réponse l'autre au client pour éviter de beaucoup de transfert de données) mais je n'ai pas réussi il fallait un discriminateur que je n'ai pas (exception EF). Je pense avoir Report sans mappage ReportContent dans ce cas quelle que soit l'action que je devrais utiliser ReportContent Je vais devoir utiliser SQL simple, ce que je ne sais pas est une bonne pratique ou pas.

Répondre

1

Il n'est pas possible de charger paresseux une propriété primitive avec EF. Toutes les propriétés de la primitive sont chargées automatiquement.

Une solution consiste à placer le contenu du rapport dans une autre entité et à utiliser cette entité à la place de la propriété de chaîne dans la classe Report.

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

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

merci j'écris mes entités me poco pas la migration de code (tables sont déjà dans le DB inverse codefirst) Je suis l'erreur Peut-être que je devrais renoncer à utiliser l'héritage et aller pour la fente de table (solution) – Mojtaba

+0

J'avais pensé une fois de plus à l'idée de l'héritage que j'ai réalisé que ça ne pouvait pas marcher. Il n'est pas possible de mapper une ligne de la table aux deux entités différentes. –

+0

Je voulais avoir Report et ReportWithContent qui est hérité de Report donc ils sont l'héritage entre les types. Cela signifie donc qu'il n'est pas possible de mapper parent et enfant à une table? – Mojtaba

Questions connexes