我正在使用多个DbSets模拟DbContext。我将对象添加到模拟对象,但是当我尝试通过其id
查询特定对象时,它会抛出错误。
AmazonReport.Tests.ProductTests.ProductControllerTest.TestReturnEditedModel:
System.InvalidOperationException : Sequence contains no matching element
我已经将问题缩小到这个函数(foreach
循环用来验证传入的id是否在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 :(得分:3)
因为通过强制转换为object
,现在使用引用相等而不是值相等。这是一个真正简化的例子:
int i = 1;
int j = 1;
bool eq = ((object)i) == ((object)j); // false
直接比较两个整数与==
比较两个值的值。