来自不同上下文的实体彼此兼容

本文关键字:实体 上下文 | 更新日期: 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

我的意思是,我们知道这两个对象(tempCurrentUser)可能指的是相同的记录,但是实例呢?它们是一样的吗?

来自不同上下文的实体彼此兼容

CurrentUsertemp 都是引用,调用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上的EqualsGetHashcode方法。例如,HashSet<T>内部使用这些方法,而不是IEquatable<T>实现的通用版本,因此,如果您不重写它们,则会得到错误的结果。