Entity Framework Generic Repository Error

15,456

Well, this one had me puzzled. I took a wild stab (after seeing a portion of the EFRepository in Stephen Walther's upcoming ASP.NET MVC Unleashed book) and it started working, here is the fix (Replace this method, notice the difference in the string formatting). Any suggestions as to why this is this way? The way that I see this, it may be a bug (or maybe something I was doing). At any rate for any of those interested. (I would imagine fixing this portion will fix the entire function of the 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()));
    }
}
Share:
15,456
Jeff Ancel
Author by

Jeff Ancel

Ruby on Rails, JQuery, Javasript, PHP, Linux/Unix, Open Source (Huge Plus) and much more. Really enjoy just jumping in and getting all of your problems solved.

Updated on June 03, 2022

Comments

  • Jeff Ancel
    Jeff Ancel almost 2 years

    I am trying to create a very generic generics repository for my Entity Framework repository that has the basic CRUD statements and uses an Interface. I have hit a brick wall head first and been knocked over. Here is my code, written in a console application, using a Entity Framework Model, with a table named Hurl. Simply trying to pull back the object by its ID. Here is the full application code.

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

    Here is the error that I am getting:

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

    This is where I am attempting to extract this information from.

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

  • Jeff Ancel
    Jeff Ancel about 15 years
    I just arrived home to test and the full solution didn't work until AFTER I added this. String.Format("[{0}Set]", (Where applicable in the above solution).
  • TheCloudlessSky
    TheCloudlessSky almost 14 years
    To get the name without hardcoding something like "[{0}Set"], see my post on another question: stackoverflow.com/questions/3247288/…