2011-08-25 3 views
1

J'utilise Entity Framework 4.1. J'ai un modèle normal .edmx qui mappe une classe Match à une table de base de données 'Match' et cela peut être accédé normalement en utilisant EF.Entity Framework Classes partielles Instancier par ID/Clé primaire

Cependant, je requièrent des propriétés personnalisées méthodes pour le match donc j'étendu cette aide d'une classe partielle et je peux ajouter mes propriétés, etc.

Tout cela fonctionne très bien, mais je ne peux pas savoir comment instancier une instance de ma classe de correspondance partielle par sa clé/ID primaire. c'est-à-dire que je peux passer l'Id dans le constructeur et que l'objet soit rempli avec toutes ses données de la base de données.

Je sais que nous pouvons faire ce qui suit pour remplir de code d'appel:

public Match PopulateforMatchId(int matchId) 
    { 
     var match = (from m in _db.Matches 
         .Include("TeamA") 
         .Include("TeamB") 
         .Include("Season") 
         .Include("Season.Competition") 
        where m.Match_ID == matchId 
        select m).FirstOrDefault(); 

     return match; 

    } 

Cependant ce n'est pas ce que je dois que ce n'est pas autonome au sein de la classe partielle elle-même, je besoin de se remplir, car d'autres propriétés de la classe partielle reposent sur le fait que l'objet lui-même a ses données en place avant de pouvoir être calculées.

Quelqu'un at-il des idées comment je peux le faire?

Merci

Kevin

+0

Avez-vous regardé 'Attach'? (http://msdn.microsoft.com/en-us/library/bb896271.aspx) Toutefois, IMO, il semble que vous approchez de ce mauvais sens. Il vaudrait mieux laisser l'ORM créer l'objet, puis remplir les blancs (en utilisant peut-être des méthodes partielles pour appliquer les changements lors de la matérialisation) –

+0

Merci pour cela, je vais aborder cela différemment étant donné qu'il semble que ce n'est pas la façon de procéder. – Kevin

Répondre

1

Ceci est mauvaise façon d'utiliser Entity Framework. Le cadre d'entité n'est pas adapté pour remplir facilement un objet existant. De plus, il exige que l'entité ait une dépendance interne vis-à-vis du contexte EF.

Comment faire probablement travailler (mais je recommande vraiment pas):

public Match(int matchId) 
{ 
    // You called constructor yourselves = you have unproxied entity without 
    // dynamic change tracking and without lazy loading 

    Id = matchId; 

    // I'm not sure if this is possible in entity constructor but generally it should work 

    // Get context somewhere - service locator pattern 
    ObjectContext context = ContextProvider.GetCurrent(); 
    context.Matches.Attach(this); 
    context.Refresh(RefreshMode.StoreWins, this); 
    // Now you should have populated Match entity itself but not its navigation properties 

    // To populate relations you must call separate query for each of them because `Include` 
    // is possible only when the entity is created and loaded by EF and lazy loading is off 
    // in this case 

    context.LoadProperty(this, m => m.TeamA); 
    context.LoadProperty(this, m => m.TeamB); 

    Season = (from s in context.Seasons.Include("Competition") 
       select s).ToList();  
} 

C'est aussi l'exemple de mauvais constructeur - constructeur ne devrait pas prendre une telle logique lourde. Cela devrait être la responsabilité d'une autre méthode d'initialisation.

+0

Merci pour cela, si ce n'est pas la bonne façon de procéder, je vais m'en tenir à ce que je faisais déjà, je voulais vérifier que je ne manquais pas quelque chose de vital. Merci beaucoup pour votre aide. – Kevin

Questions connexes