2009-03-30 6 views
11

Ich versuche, ein sehr generisches Generika-Repository für mein Entity Framework-Repository zu erstellen, das die grundlegenden CRUD-Anweisungen enthält und eine Schnittstelle verwendet. Ich habe zuerst einen Ziegelsteinkopf getroffen und wurde umgeworfen. Hier ist mein Code, geschrieben in einer Konsolenanwendung, mit einem Entity Framework Model, mit einer Tabelle namens Hurl. Einfach versuchen, das Objekt anhand seiner ID zurückzuziehen. Hier ist der vollständige Anwendungscode. HierEntity Framework Generischer Repository-Fehler

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(); 
      } 
     } 
    } 

} 

ist der Fehler, ich erhalte:

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." 

Dies ist, wo ich aus diesen Daten zu extrahieren bin versucht.

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

+0

Ich denke, eine kürzere Antwort ist, wo könnte ich das Debuggen dieses Problem zu starten gehen. –

Antwort

6

Nun, dieser hatte mich verwirrt. Ich nahm einen wilden Stich (nachdem ich einen Teil des EFRepository in Stephen Walthers kommendem ASP.NET MVC Unleashed Buch gesehen hatte) und es fing an zu arbeiten, hier ist der Fix (Ersetze diese Methode, bemerke den Unterschied in der String Formatierung). Irgendwelche Vorschläge, warum das so ist? So wie ich das sehe, könnte es ein Fehler sein (oder vielleicht etwas, das ich gemacht habe). Auf jeden Fall für alle Interessierten. (Ich könnte mir vorstellen, dass das Reparieren dieses Teils die gesamte Funktion des EFRepository @Keith Patton's blog post repariert).

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

Ich bin gerade erst nach Hause gekommen, um zu testen und die volle Lösung hat nicht funktioniert, bis ich das hinzugefügt habe. String.Format ("[{0} Set]", (Wo in der obigen Lösung anwendbar). –

+1

Um den Namen ohne hardcoding etwas wie "[{0} Set"] ​​', finden Sie in meinem Beitrag auf eine andere Frage: http : //stackoverflow.com/questions/3247288/error-in-generic-repository-method-for-entity-framework/3247456#3247456 – TheCloudlessSky