2009-03-30 8 views
11

J'essaie de créer un référentiel générique très générique pour mon référentiel Entity Framework qui a les instructions CRUD de base et utilise une interface. J'ai d'abord frappé une tête de mur de briques et j'ai été renversé. Voici mon code, écrit dans une application console, en utilisant un Entity Framework Model, avec une table nommée Hurl. Simplement essayer de retirer l'objet par son identifiant. Voici le code complet de l'application.Entity Framework Erreur de référentiel générique

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Objects; 
using System.Linq.Expressions; 
using System.Reflection; 
using System.Data.Objects.DataClasses; 

namespace GenericsPlay 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var hs = new HurlRepository(new hurladminEntity()); 
      var hurl = hs.Load<Hurl>(h => h.Id == 1); 
      Console.Write(hurl.ShortUrl); 
      Console.ReadLine(); 

     } 
    } 

    public interface IHurlRepository 
    { 
     T Load<T>(Expression<Func<T, bool>> expression); 
    } 

    public class HurlRepository : IHurlRepository, IDisposable 
    { 

     private ObjectContext _objectContext; 

     public HurlRepository(ObjectContext objectContext) 
     { 
      _objectContext = objectContext; 
     } 

     public ObjectContext ObjectContext 
     { 
      get 
      { 
       return _objectContext; 
      } 
     } 

     private Type GetBaseType(Type type) 
     { 
      Type baseType = type.BaseType; 
      if (baseType != null && baseType != typeof(EntityObject)) 
      { 
       return GetBaseType(type.BaseType); 
      } 
      return type; 
     } 

     private bool HasBaseType(Type type, out Type baseType) 
     { 
      Type originalType = type.GetType(); 
      baseType = GetBaseType(type); 
      return baseType != originalType; 
     } 

     public IQueryable<T> GetQuery<T>() 
     { 
      Type baseType; 
      if (HasBaseType(typeof(T), out baseType)) 
      { 
       return this.ObjectContext.CreateQuery<T>("[" + baseType.Name.ToString() + "]").OfType<T>(); 
      } 
      else 
      { 
       return this.ObjectContext.CreateQuery<T>("[" + typeof(T).Name.ToString() + "]"); 
      } 
     } 

     public T Load<T>(Expression<Func<T, bool>> whereCondition) 
     { 
      return this.GetQuery<T>().Where(whereCondition).First(); 
     } 

     public void Dispose() 
     { 
      if (_objectContext != null) 
      { 
       _objectContext.Dispose(); 
      } 
     } 
    } 

} 

Voici l'erreur que je reçois:

System.Data.EntitySqlException was unhandled 
    Message="'Hurl' 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 3, column 1." 
    Source="System.Data.Entity" 
    Column=1 
    ErrorContext="escaped identifier" 
    ErrorDescription="'Hurl' 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." 

C'est là que je tente d'extraire ces informations.

http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx

+0

je suppose une réponse plus courte est où pourrais-je aller pour commencer le débogage ce problème. –

Répondre

6

Eh bien, celui-ci m'a fait perplexe. J'ai pris un coup sauvage (après avoir vu une partie de l'EFRepository dans le prochain livre de Stephen Walther ASP.NET MVC Unleashed) et il a commencé à travailler, voici le correctif (Remplacer cette méthode, notez la différence dans la mise en forme de chaîne). Des suggestions pour expliquer pourquoi c'est comme ça? La façon dont je vois ça, ça peut être un bug (ou peut-être quelque chose que je faisais). En tout cas pour tous ceux qui sont intéressés. (J'imagine que la réparation de cette partie va réparer toute la fonction de l'EFRepository @Keith Patton's blog post).

public IQueryable<T> GetQuery<T>() 
{ 
    Type baseType; 
    if (HasBaseType(typeof(T), out baseType)) 
    { 
     return this.ObjectContext.CreateQuery<T>(String.Format("[{0}]", baseType.Name.ToString())).OfType<T>(); 
    } 
    else 
    { 
     return this.ObjectContext.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())); 
    } 
} 
+0

Je viens d'arriver à la maison pour tester et la solution complète n'a pas fonctionné jusqu'à APRÈS avoir ajouté ceci. String.Format ("[{0} Set]", (Le cas échéant dans la solution ci-dessus) –

+1

Pour obtenir le nom sans coder en dur quelque chose comme '" [{0} Set "]', voir mon message sur une autre question: http : //stackoverflow.com/questions/3247288/error-in-generic-repository-method-for-entity-framework/3247456#3247456 – TheCloudlessSky