2014-10-03 1 views
0

Это продолжение this questionиздевались DbSet делает возвращаемое значение при использовании genrics

Я насмешливо в DbContext с несколькими DbSets. Я добавляю объекты к издеваемым объектам, но когда я пытаюсь запросить конкретный объект по его id, он выдает ошибку.

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

я сузил проблему этой функции (цикл foreach есть, чтобы убедиться, что идентификатор им проходя находится в 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 и использую return this.DbSet.Single(x => Convert.ToInt32(x.Id) == Convert.ToInt32(id));, она не выкинет ошибку.

Так что мой вопрос в том, почему сравнение не возвращает никаких объектов, если DbSet содержит объект с id == 3 и принятый в TId id == 3?

+0

Можем ли мы увидеть код настройки для насмешливого DbSet? –

ответ

3

Потому что, литая оба значения до object, вместо равенства ценности используется ссылочное равенство. Вот действительно сводилось пример того, что происходит:

int i = 1; 
int j = 1; 

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

В то время как прямого сравнения двух целых чисел с == сравнивает два по значению.

+0

Спасибо. Будет ли функция 'object.equals()' работать для сравнения двух? – DFord

+1

Да, 'object.Equals' будет сравнивать аргументы по значению, если они являются типами значений. Я не уверен, что это будет хорошо играть с EF. –

+0

Я не видел этого сравнения. Хотя OP является Moq-ing DbSet, возможно, он не смог обработать метод GetEnumerator, который привел бы к тому, что методы расширения Linq, такие как 'Single', потерпят неудачу (если он не сделал частичного макета) –

Смежные вопросы