来自不同上下文的实体彼此兼容
本文关键字:实体 上下文 | 更新日期: 2023-09-27 18:35:38
假设执行了以下一段代码:
using (var e = new MyEntities())
CurrentUser = (from u in e.users where (...) select u).SingleOrDefault();
当using
块结束时,我只能访问用户字段,这没关系。
现在,在其他一些代码中,在另一个线程中,我创建了另一个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();
}
}
备注:您也应始终覆盖object
上的Equals
和GetHashcode
方法。例如,HashSet<T>
内部使用这些方法,而不是IEquatable<T>
实现的通用版本,因此,如果您不重写它们,则会得到错误的结果。