2010-04-11 4 views
1

Je travaille sur une application ASP.NET MVC existante qui a commencé petit et a grandi avec le temps pour exiger une bonne réarchitecture et refactoring. Une chose avec laquelle je suis aux prises est que nous avons des classes partielles des entités L2S afin que nous puissions ajouter des propriétés supplémentaires, mais ces accessoires créent un nouveau contexte de données et interrogent la base de données pour un sous-ensemble de données. Ce serait l'équivalent de faire ce qui suit dans SQL, ce qui est une très bonne façon d'écrire cette requête comme oppsed à Jointures:refactor LINQ TO SQL propriétés personnalisées qui instancient datacontext

SELECT tbl1.stuff, 
    (SELECT nestedValue FROM tbl2 WHERE tbl2.Foo = tbl1.Bar), 
    tbl1.moreStuff 
FROM tbl1 

si bref est ici ce que nous avons dans une partie de notre entité partielle classes:

public partial class Ticket { 

public StatusUpdate LastStatusUpdate 
{ 
    get 
    { 
     //this static method call returns a new DataContext but needs to be refactored 
     var ctx = OurDataContext.GetContext(); 
     var su = Compiled_Query_GetLastUpdate(ctx, this.TicketId); 
     return su; 
    } 
} 

} 

nous avons quelques fonctions qui créent une requête compilée, mais le problème est que nous avons aussi quelques DataLoadOptions définis dans le DataContext, et parce que nous instancier un nouveau DataContext pour obtenir ces biens imbriqués, nous obtenir une exception

"Recherches Compilé à travers DataContexts avec différents LoadOptions non pris en charge"

. Le premier DataContext provient d'un DataContextFactory que nous avons implémenté avec les refactorings, mais ce second est simplement suspendu à l'accesseur de propriété de l'entité.

Nous implémentons le modèle Repository dans le processus de refactoring, donc nous devons cesser de faire des choses comme ci-dessus. Est-ce que quelqu'un sait d'un bon moyen de résoudre ce problème?

EDIT: J'ajoute le code pour DataContextFactory que nous avons créé lors de nos efforts de refactoring. Notez que dans le code ci-dessus, nous avons une méthode statique GetContext() dans la classe Linq DataContext, qui nouvelles un datacontext et n'utilise pas le DataContextFactory ci-dessous:

public class DataContextFactory<T> : IDataContextFactory where T : System.Data.Linq.DataContext 
{ 
    public DataContextFactory() 
    { 
     _context = Activator.CreateInstance<T>(); 
    } 

    public DataContextFactory(T context) 
    { 
     _context = context; 
    } 

    private System.Data.Linq.DataContext _context; 
    public System.Data.Linq.DataContext Context 
    { 
     get 
     { 
      return _context; 
     } 
    } 

    public void SaveAll() 
    { 
     Context.SubmitChanges(); 
    } 

    public bool IsContextDirty 
    { 
     get 
     { 
      return Context != null && (Context.GetChangeSet().Deletes.Count > 0 || 
              Context.GetChangeSet().Inserts.Count > 0 || 
              Context.GetChangeSet().Updates.Count > 0); 
     } 
    } 
} 
+0

btw, un peu plus d'infos donc je n'obtiens pas les gens qui répondent au mauvais problème. Je comprends pourquoi nous obtenons l'exception LoadOptions, et nous avons résolu cela en faisant l'attribution de LoadOptions un appel de délégué statique immédiatement lorsque le DataContext est chargé. Le principal problème est que nous avons en fait 2 contextes distincts, et en raison de la nouvelle implémentation d'un modèle de référentiel, nous devons faire en sorte que ces propriétés puissent utiliser le même contexte créé par DataContextFactory à partir du référentiel. –

+0

Le DataContextFactory instancie-t-il un nouveau DataContext chaque fois que GetContext est appelé? – SteadyEddi

+0

@SteadyEddi - J'ai modifié mon article original avec le code de DataContextFactory. Donc, pour répondre à votre question, la méthode GetContext() n'est pas en usine, mais plutôt dans la classe DataContext. Et instancie un nouveau contexte à chaque fois. Cependant, la classe Factory sauvegardera le contexte dans un champ privé, tant que nous nous accrocherons à l'instance d'usine pendant toute la durée de la requête Web (puisque c'est pour une application ASP.NET MVC). –

Répondre

0

Au lieu de créer DataContext chaque fois que la méthode est appelé, stockez-le dans HttpContext.Current.Items.

Cela aura le même effet que de le stocker dans un champ privé, car il sera unique à la demande.