实体框架的通用存储库方法出错

时间:2010-07-14 14:43:41

标签: c# .net entity-framework

我正在尝试创建一个在我的基类中用于我的存储库的通用方法,而且我遇到了问题。这是方法......

        public virtual T First(System.Linq.Expressions.Expression<Func<T, bool>> where, List<string> properties)
    {
        IQueryable<T> query = null;
        if (where != null)
        {
            query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where);
        }
        else
        {
            query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString()));
        }

        foreach (string s in properties)
        {
            query = query.Include(s);
        }

        T _result = (T)query.First();

        return _result;
    }

当我运行代码时,它给了我这个错误:

  

'公司'无法解决   当前的范围或背景。使   确保所有引用的变量都是   在范围内,所需的模式是   加载,并且名称空间是   正确引用。几乎逃脱了   标识符,第1行,第1列。

我知道为什么会这样做,我只是不知道如何修复它。我认为它正在这样做,因为我的ObjectContext不知道对象“公司”,但它确实知道“公司”。关于如何解决这个问题的任何想法??

错误发生在这一行:

  

T _result =(T)query.First();

谢谢!

2 个答案:

答案 0 :(得分:7)

Dan,使用以下内容获取实体集名称:

string entitySetName = context.MetadataWorkspace
                        .GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace)
                        .BaseEntitySets.Where(bes => bes.ElementType.Name == typeof(T).Name).First().Name;

string name = String.Format("{0}.{1}", context.DefaultContainerName, entitySetName);

query = context.CreateQuery<T>(name).Where(where);

执行此操作将解析查询的正确复数名称。

使用Yury的方法是最好的选择。

编辑顺便说一下,如果查询没有返回任何实体(它将抛出FirstOrDefault()),则应返回First()而不是InvalidOperationException。< / p>

答案 1 :(得分:6)

尝试使用

 query = _context.CreateObjectSet<T>().Where(where);

而不是

 query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where);