2010-07-14 6 views
1

J'essaie de créer une méthode générique à utiliser dans ma classe de base pour mes référentiels et j'ai un problème. Voici la méthode ...Erreur dans la méthode de référentiel générique pour Entity Framework

 public virtual T First(System.Linq.Expressions.Expression<Func<T, bool>> where, List<string> properties) 
    { 
     IQueryable<T> query = null; 
     if (where != null) 
     { 
      query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where); 
     } 
     else 
     { 
      query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())); 
     } 

     foreach (string s in properties) 
     { 
      query = query.Include(s); 
     } 

     T _result = (T)query.First(); 

     return _result; 
    } 

Quand je lance le code, il me donne cette erreur:

'Company' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly. Near escaped identifier, line 1, column 1.

J'ai une idée pourquoi il fait cela, je ne sais pas comment résoudre il. Je pense qu'il le fait parce que mon ObjectContext ne connaît pas l'objet "Company" mais il connaît "Companies". Des idées pour résoudre le problème??

L'erreur se produit sur cette ligne:

T _result = (T)query.First();

Merci!

+0

Habituellement, les noms des ensembles d'entités sont pluralisés, c'est pourquoi le contexte connaît les entreprises. Quelle version de EF utilisez-vous? –

+0

J'utilise la version 4. Oui, et je suppose que c'est pour ça que ça ne marche pas ... mais y a-t-il un moyen de le faire fonctionner? –

+1

Utilisez 'FirstOrDefault' au lieu de' First' dans le cas où la requête ne renvoie aucun résultat. – TheCloudlessSky

Répondre

6

Essayez d'utiliser

query = _context.CreateObjectSet<T>().Where(where); 

au lieu de

query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where); 
+0

Cela a fonctionné. Merci Yury! Maintenant, pouvez-vous, ou quelqu'un, expliquer pourquoi cela a fonctionné? –

+1

Vous êtes les bienvenus. Eh bien, pourquoi ce travail. L'introduction de 'IObjectSet ' et 'ObjectSet ' est l'une des améliorations apportées à efv4. Dans la version précédente, il était difficile de créer un référentiel générique puisque vous deviez connaître le nom de entityset pour le type d'entité avec lequel vous travailliez. Voici un bon exemple de 'Repository ' implémentation avec une seule chose: ne pas passer 'Func ' en tant que sélecteur utiliser 'Expression >' comme vous l'avez déjà fait: http://devtalk.dk/2009/ 06/09/Entity + Framework + 40 + Bêta + 1 + POCO + ObjectSet + Référentiel + Et + UnitOfWork.aspx –

6

Dan, obtenir l'entité nom du jeu avec quelque chose comme ce qui suit:

string entitySetName = context.MetadataWorkspace 
         .GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace) 
         .BaseEntitySets.Where(bes => bes.ElementType.Name == typeof(T).Name).First().Name; 

string name = String.Format("{0}.{1}", context.DefaultContainerName, entitySetName); 

query = context.CreateQuery<T>(name).Where(where); 

Faire cela résoudra le pluriel approprié nom pour la requête.

L'utilisation de la méthode de Yury serait cependant la meilleure option.

EDIT Par ailleurs, vous devez retourner FirstOrDefault() au lieu de First() dans le cas où la requête renvoie aucune entité (il lancera une InvalidOperationException).

+0

Modifié en FirstOrDefault(). Merci pour l'aide! –

Questions connexes