【问题标题】:Entity Framework Generic Repository Error实体框架通用存储库错误
【发布时间】:2023-03-18 10:49:01
【问题描述】:

我正在尝试为我的实体框架存储库创建一个非常通用的泛型存储库,该存储库具有基本的 CRUD 语句并使用接口。我先撞到了砖墙头,然后被撞倒了。这是我的代码,在控制台应用程序中编写,使用实体框架模型,带有一个名为 Hurl 的表。只需尝试通过其 ID 拉回对象。这是完整的应用程序代码。

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

}

这是我得到的错误:

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

这是我试图从中提取此信息的地方。

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

【问题讨论】:

  • 我想一个简短的答案是我可以从哪里开始调试这个问题。

标签: c# entity-framework generics repository-pattern


【解决方案1】:

嗯,这个让我很困惑。我进行了一次疯狂的尝试(在看到 Stephen Walther 即将出版的 ASP.NET MVC Unleashed 书中的 EFRepository 的一部分之后),它开始工作,这是修复(替换此方法,注意字符串格式的差异)。关于为什么会这样的任何建议?在我看来,这可能是一个错误(或者我正在做的事情)。无论如何,对于任何感兴趣的人来说。 (我想修复这部分将修复 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()));
    }
}

【讨论】:

  • 我刚回到家进行测试,直到我添加了这个完整的解决方案才起作用。 String.Format("[{0}Set]", (适用于上述解决方案)。
  • 要获得名称而无需像"[{0}Set"] 这样的硬编码,请参阅我在另一个问题上的帖子:stackoverflow.com/questions/3247288/…
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多