2010-07-14 66 views
1

我想创建一个通用方法在我的基类中用于我的存储库,并且遇到问题。这里的方法...实体框架的通用存储库方法中的错误

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

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

'Company' 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 1, column 1.

我有它为什么这样的想法,我只是不知道如何解决它。我认为这是因为我的ObjectContext不知道对象“公司”,但它确实知道“公司”。有想法该怎么解决这个吗??

错误发生在这条线:

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

谢谢!

+0

通常实体集名称是复数形式,这就是上下文知道公司的原因。你使用哪个版本的EF? – 2010-07-14 14:52:55

+0

我正在使用版本4.是的,我猜这就是为什么它不工作......但有没有办法让它工作? – 2010-07-14 14:55:43

+1

如果查询不返回任何结果,则使用'FirstOrDefault'而不是'First'。 – TheCloudlessSky 2010-07-14 15:09:47

回答

6

尝试使用

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

代替

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

这工作。感谢Yury!现在你或者某个人能解释为什么这会起作用吗? – 2010-07-15 13:40:52

+1

不客气。那么,为什么这项工作。 'IObjectSet '和'ObjectSet '的介绍是efv4中的改进之一。在以前的版本中,创建一个通用存储库非常棘手,因为您必须知道您正在使用的实体类型的entityset的名称。这里有一个很好的例子,除了一件事:'不要通过'Func '作为选择器使用'Expression >''''''作为您已经完成的':Repository ''执行:http://devtalk.dk/2009/ 06/09/Entity + Framework + 40 + Beta + 1 + POCO + ObjectSet + Repository + And + UnitOfWork.aspx – 2010-07-15 14:46:52

6

丹,用类似下面让实体集名称:

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)。

+0

更改为FirstOrDefault()。谢谢您的帮助! – 2010-07-15 13:44:53