2010-07-14 83 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