假设执行了以下代码:
using (var e = new MyEntities())
CurrentUser = (from u in e.users where (...) select u).SingleOrDefault();
当 using
block 结束时,我只能访问用户字段,没关系。
现在在其他一些代码中,在另一个线程中,我创建了另一个 MyEntities
实例并执行另一个查询,如下所示:
using (var e = new MyEntities())
temp = (from u in e.users where (...some other condition...).SingleOrDefault();
现在,做下面的比较对吗?
temp==CurrentUser
我的意思是,我们知道这两个对象(temp
、CurrentUser
)可能指的是同一条记录,但是实例呢?它们是一样的吗?
最佳答案
两者都是 CurrentUser
和 temp
是引用,调用 temp == CurrentUser
只比较那些引用(而不是实际对象),所以它们永远不会是真的。如果你想比较你的实体,最好的办法是实现 IEquatable
并覆盖 obect.Equals()
和 object.GetHashcode()
.然后你可以调用temp.Equals(CurrentUser)
这将给出所需的行为。例如:
public class User : IEquatable<User>
{
public int Id {get; set;}
...
public bool Equals(User other)
{
return this.Id == other.Id;
}
public override bool Equals(object other)
{
return this.Id == (User)other.Id;
}
public override int GetHashcode()
{
return this.Id.GetHashCode();
}
}
注意:您应该始终覆盖 Equals
和 GetHashcode
object
上的方法也。例如HashSet<T>
在内部使用这些方法而不是 IEquatable<T>
实现的通用版本因此,如果您不覆盖它们,您将得到错误的结果。
关于c# - 来自不同上下文的实体是否相互兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35538642/