2014-10-03 98 views
0

時,這是this question嘲笑DbSet不使用genrics

我嘲笑一個的DbContext多DbSets的延續返回值。我將對象添加到模擬對象中,但是當我嘗試通過其id查詢特定對象時,它會引發錯誤。

AmazonReport.Tests.ProductTests.ProductControllerTest.TestReturnEditedModel: 
    System.InvalidOperationException : Sequence contains no matching element 

我有問題的範圍縮小到這個功能(foreach循環是有驗證ID IM傳遞是在DbSet,它是)

public virtual TEntity Get(TId id) 
    { 
     foreach(TEntity b in this.DbSet) 
     { 
      Console.WriteLine(b.Id + " and " + id); 
     } 
     return this.DbSet.Single(x => (object)x.Id == (object)id); 
     //return this.DbSet.Single(x => Convert.ToInt32(x.Id) == Convert.ToInt32(id)); 
     //return this.DbSet.SingleOrDefault(x => (object)x.Id == (object)id); 
    } 

原樣,它不起作用。但是,如果我註釋掉當前的退貨聲明並使用return this.DbSet.Single(x => Convert.ToInt32(x.Id) == Convert.ToInt32(id));它不會拋出錯誤。

所以我的問題是,當DbSet包含一個對象id == 3和傳入TId id == 3爲什麼比較不返回任何對象?

+0

我們可以看到模擬DbSet的設置代碼嗎? – 2014-10-03 15:01:33

回答

3

因爲通過將兩者都投射到object,現在使用引用相等而不是值相等。這裏是正在發生的事情的真正歸結例如:

int i = 1; 
int j = 1; 

bool eq = ((object)i) == ((object)j); // false 

而直接比較兩個整數與==由價值兩相比較。

+0

謝謝。 object.equals()函數可以用來比較兩者嗎? – DFord 2014-10-03 15:08:42

+1

是的,如果object.Equals是值類型的話,它們會根據值比較參數。但我不確定那會很好地與EF一起玩。 – 2014-10-03 15:12:54

+0

我沒有看到比較。雖然OP是Moq-ing DbSet,但他可能沒有Moq-ed GetEnumerator方法,這會導致Linq的擴展方法(如Single)失敗(假設他沒有完成部分模擬) – 2014-10-03 15:13:43