2010-05-20 6 views
1

Scénario: Entity Framework 4, modèles POCO et relation Détails principaux.Détails persistants dans la relation Détails de détail EF4 POCO

Disons que j'ai un type de maître comme ceci:

//partial implementation of master entity 
partial class Master 
{ 
    public void AddDetail(x,y,z) 
    { 
     var detail = new Detail() 
     { 
      X = x, 
      Y = y, 
      Z = z, 
     }; 

     //add the detail to the master 
     this.Details.Add(detail); 
    } 
} 

Si je puis ajouter une instance de maître à mon contexte et livrez, les détails ne seront pas enregistrées:

var masterObject = new Master(); 
masterObject.AddDetail(1,2,3); 
myContext.MasterSet.AddObject(masterObject); 

est-il un moyen de rendre les détails à persister par reachabillity lors de l'utilisation de modèles POCO? Ou de toute autre manière? La collection Details dans l'entité Master est une FixUpCollection, elle doit donc suivre les modifications IMO.

Donc, des idées pour que cela fonctionne sans trop tuer le POCO?

Répondre

0

J'ai trouvé la solution.

Je dois simplement passer SaveOptions.DetectChangesBeforeSave comme ceci:

context.SaveChanges(SaveOptions.DetectChangesBeforeSave); 

Cela me permet d'ajouter des objets de détail à l'objet maître w/o attacher chaque détail au contexte.

-1

Vous pourrait:

Ajouter un constructeur à vos entités qui accepte un contexte, qui est sauvé par référence dans un domaine privé. Votre fonction AddDetail peut alors vérifier le champ privé _context et, s'il fait référence à un contexte instancié, ajouter les détails au contexte après l'enregistrement de l'enregistrement maître.

Mais ...

Cela pourrait ne pas être le meilleur modèle, car elle viole le principe de responsabilité unique. Je pense qu'il serait préférable d'utiliser un modèle Repository, et que le Repository valide les Détails non sauvegardés. Here est un excellent article sur l'implémentation du Repository Pattern dans Entity Framework 4.

+0

La première suggestion viole assez POCO. Et la deuxième suggestion ne résout pas le problème des détails modifiés. Les référentiels sont supposés stocker des racines agrégées, vous n'êtes pas censé en avoir pour les sous-objets dans un agrégat. Pour résoudre ce problème dans le référentiel, il faudrait donc vérifier si un détail est nouveau ou déjà persistant, etc. –