2013-12-20 68 views
1

這個問題不是關於如何測試數據訪問,也不是存儲庫。這是關於當我想在項目中使用我的POCO類(我使用TDD製作的)時遇到的問題。 我的意思是,這是因爲Linq to Entities的限制(或者可能是我關於類的設計的問題)的問題。TDD和CodeFirst(實體框架)

我已經通過TDD抵達的類可以在接下來的(非常simplificated,當然):

public class Person{ 
    public int IdPerson{ get; set; } 
    public string Name { get; set; } 
    public int Average { get; set; } 
} 

public class Course{ 
    public int IdCourse { get; set;} 
    public Person Professor { get; set;} 
    public IEnumerable<Person> Staff { get; set;} 
    public IEnumerable<Person> Students { get; set;} 

    public IEnumerable<Person> GetGreatStudents(){ 
     return Students.Where(n => n.Average > 8); 
    } 
} 

很簡單,不是嗎?

那麼......那麼問題是什麼?讓我們來看看......當我想從數據庫中檢索課程中的所有數據時(課程類在現實模型中有很多子集)對它們應用過濾器,唯一的辦法就是像這樣:

var course = from obj in Courses //Doesn't matter how i get the courses' collection 
      select { 
       IdCourse = obj.IdCourse, 
       GreatStudents = obj.GetGreatStudents(), // Here is the problem 
       OtherCollection = obj.OtherCollection.Where(n => n.Active).Select(n => n.Property1) 
      } 

如你所知,它會返回一個錯誤,因爲GetGreatStudents的()功能:

LINQ到實體無法識別方法[...]這種方法 不能翻譯成商店表達。

我的意思是,我知道我可以直接與。凡替換方法(N => n.Average> 8)但它是可怕(和在現實中有很多的過濾器),並且就此而言,如果我不能使用我已經構建和測試的API,那麼TDD有什麼意義?

所以,我的問題是爲那些有TDD和實體框架開發經驗的人,如何在使用Linq to Entities時使用通過TDD設計的漂亮API?

+0

你讀過這篇文章:http://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet – Colin

+0

我不跟着你@科林,這對我有幫助嗎? –

+0

供參考:在真正的課堂上,我沒有IEnumerable <>但收集<> –

回答

0

首先,我同意這是一個TDD問題

您所遇到的問題是,你一直沒能實現持久性的無知(因爲你使用TDD的時候碰上了!);你的實體與SQL綁定(因此我認爲它們不是嚴格意義上的POCOs,因爲它們綁定到特定的框架)

我發現這個問題的唯一解決方案是將域模型對象與持久性模型對象(即EF對象)並編寫一個能夠從我的域對象映射到持久性對象的庫。這是很多工作,我會質疑它是否值得用於小型項目。如果你在純粹主義之前就把實用主義放在了簡單的地方(但不太令人滿意),即使你可以爲它們編寫單元測試,也可以簡單地理解你不能在EF中做這樣的事情。

我發現thisthis是有幫助的,雖然有點片面。

你的問題是一箇舊的帖子,所以如果你找到了更好的方式,我很樂意聽到它。

相關問題