2009-07-29 6 views
0

I'm following Steve Sanderson's example from this ASP.NET MVC book sur la création d'un modèle à la main au lieu d'utiliser des outils de création de diagrammes pour le faire pour moi. Donc, dans mon espace de noms de modèle que je place une classe appelée MySystemModel avec quelque chose comme ce qui suit dans ceIMultipleResults Utilisation du modèle personnalisé et du référentiel

[Table(Name="tblCC_Business")] 
public class Business 
{ 
    [Column(IsPrimaryKey=true, IsDbGenerated=false)] 
    public string BusinessID { get; set; } 

    // this is done because Business column and Business have interfering names 
    [Column(Name="Business")] public string BusinessCol { get; set; } 
} 

Cette partie est tout va bien. Le problème est cependant de renvoyer plusieurs ensembles de résultats à partir d'une procédure stockée, mais de mélanger et de mettre en correspondance SQL avec la modélisation LINQ. Nous faisons cela parce que la traduction de LINQ to SQL est trop lente pour certaines de nos requêtes (il n'y a vraiment aucun intérêt à argumenter ici, c'est une exigence commerciale). Donc, fondamentalement, j'utilise des instructions SQL réels ainsi que mes modèles LINQ dans mon « dépôt » comme ceci:

public IEnumerable<MyType> ListData(int? arg) 
{ 
    string query = "SELECT * FROM MyTable WHERE argument = {0}"; 

    return _dc.ExecuteQuery<MyType>(query, arg); 
    //c.GetTable<MyType>(); <-- this is another way of getting all data out quickly 
} 

Maintenant, le problème que je vais avoir est de savoir comment retourner plusieurs jeux de résultats que je ne suis pas étendre DataContext, comme si:

public ContractsControlRepository() 
{ 
    _dc = new DataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()); 
} 

This link décrit comment plusieurs ensembles de résultats sont renvoyés par les procédures stockées.

[Function(Name="dbo.VariableResultShapes")] 
[ResultType(typeof(VariableResultShapesResult1))] 
[ResultType(typeof(VariableResultShapesResult2))] 
public IMultipleResults VariableResultShapes([Parameter(DbType="Int")] System.Nullable<int> shape) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), shape); 
    return ((IMultipleResults)(result.ReturnValue)); 
} 

Comment puis-je transformer cela en quelque chose qui peut être utilisé par mon dépôt? Je dois juste être capable de renvoyer plusieurs ensembles de résultats à partir d'un référentiel qui contient DataContext, et ne l'étend pas. Si vous avez copié et collé l'extrait précédent dans un dépôt comme je l'ai, il indiquera simplement comment ExecuteMethodCall n'est pas disponible, mais ce n'est disponible que si vous étendez DataContext.

Ressources

Guy Berstein's Blog

Répondre

0

Chaque fois que je pose une question qui a été me entravait pendant des jours, je finis par trouver la réponse en quelques minutes. Quoi qu'il en soit, la réponse à ce problème est que vous devez étendre DataContext dans votre dépôt. Si comme moi vous êtes inquiet d'avoir à spécifier la chaîne de connexion dans chaque contrôleur unique, vous pouvez changer le constructeur dans la classe du référentiel à quelque chose comme ceci:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

De cette façon, lorsque vous instancier votre référentiel la connexion est Configurer pour vous déjà, ce qui vous donne moins de soucis, et centralise réellement en spécifiant la chaîne de connexion. L'extension de DataContext signifie également que vous avez accès à toutes les méthodes protégées telles que ExecuteMethodCall utilisées pour appeler des procédures stockées et ramener, si vous voulez, plusieurs jeux de résultats.

Questions connexes