简体   繁体   English

实体框架通用存储库错误

[英]Entity Framework Generic Repository Error

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. 我正在尝试为我的Entity Framework存储库创建一个非常通用的泛型存储库,该存储库具有基本的CRUD语句并使用接口。 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. 这是我的代码,使用实体框架模型在控制台应用程序中编写,其中包含一个名为Hurl的表。 Simply trying to pull back the object by its ID. 只需尝试通过其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 http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx

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). 我采取了狂野的刺(在Stephen Walther即将推出的ASP.NET MVC Unleashed书中看到EFRepository的一部分后)它开始工作,这里是修复(替换此方法,注意字符串格式的差异)。 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). 我看到这个的方式,可能是一个bug(或者我正在做的事情)。 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 ). (我想想修复这部分将修复EFRepository @ Keith Patton的博客文章的整个功能)。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM